阅读584 返回首页    go 阿里云 go 技术社区[云栖]


《Spring攻略(第2版)》——1.10 用@Required注解检查属性

本节书摘来自异步社区《Spring攻略(第2版)》一书中的第1章,第1.10节,作者: 【美】Gary Mak , Josh Long , Daniel Rubio着,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.10 用@Required注解检查属性

1.10.1 问题
Spring的依赖检查功能仅能检查某些类型的所有属性。它的灵活性不够,不能仅检查特定的属性。在大部分情况下,你希望检查特定的属性是否设置,而不是特定类型的所有属性。

1.10.2 解决方案
RequiredAnnotationBeanPostProcessor是一个Spring bean后处理器,检查带有@Required注解的所有Bean属性是否设置。Bean后处理器是一类特殊的Spring bean,能够在每个Bean初始化之前执行附加的工作。为了启用这个Bean后处理器进行属性检查,必须在Spring IoC容器中注册它。注意,这个处理器只能检查属性是否已经设置,而不能测试属性是否非空。

1.10.3 工作原理
假定对于序列生成器来说,prefixGenerator和suffix属性都是必要的。你可以用@Required注解它们的设值方法。

package com.apress.springrecipes.sequence;

import org.springframework.beans.factory.annotation.Required;

public class SequenceGenerator {
   private PrefixGenerator prefixGenerator;
   private String suffix;
   ...
   @Required
   public void setPrefixGenerator(PrefixGenerator prefixGenerator) {
     this.prefixGenerator = prefixGenerator;
   }

   @Required
   public void setSuffix(String suffix) {
     this.suffix = suffix;
   }
   ...
}

为了要求Spring检查所有序列生成器实例上这些属性是否已经设置,你必须在IoC容器中注册一个RequiredAnnotationBeanPostProcessor实例。如果你打算使用Bean工厂,就必须通过API注册这个Bean后处理器,否则,只能在应用上下文中声明这个Bean后处理器的实例。

<bean  />

如果你正在使用Spring 2.5或者更高版本,可以简单地在Bean配置文件中包含元素,这将自动地注册一个RequiredAnnotationBeanPostProcessor实例。

<beans xmlns="https://www.springframework.org/schema/beans"
   xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="https://www.springframework.org/schema/context"
   xsi:schemaLocation="https://www.springframework.org/schema/beans
     https://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     https://www.springframework.org/schema/context
     https://www.springframework.org/schema/context/spring-context-3.0.xsd">

   <context:annotation-config />
   ...
</beans>

如果任何带有@Required的属性未设置,Bean后处理器将抛出一个BeanInitializationException异常。

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error
creating bean with name 'sequenceGenerator' defined in class path resource [beans.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.
BeanInitializationException: Property 'prefixGenerator' is required for bean
'sequenceGenerator'

除了@Required注解之外,RequiredAnnotationBeanPostProcessor还能用自定义的注解检查属性。例如,你可以创建如下注解类型:

package com.apress.springrecipes.sequence;
...
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Mandatory {
}

然后将这个注解应用到必要属性的设值方法。

package com.apress.springrecipes.sequence;

public class SequenceGenerator {

   private PrefixGenerator prefixGenerator;
   private String suffix;
   ...
   @Mandatory
   public void setPrefixGenerator(PrefixGenerator prefixGenerator) {
     this.prefixGenerator = prefixGenerator;
   }

   @Mandatory
   public void setSuffix(String suffix) {
     this.suffix = suffix;
   }
   ...
}

为了用这个注解类型检查属性,你必须在RequiredAnnotationBeanPostProcessor的required AnnotationType属性中指定。

<bean >
   <property name="requiredAnnotationType">
     <value>com.apress.springrecipes.sequence.Mandatory</value>
   </property>
</bean>

最后更新:2017-05-31 15:31:29

  上一篇:go  揭密出席第九届中国云计算大会的专家—近20个国家学者共话云计算大数据生态、应用
  下一篇:go  《Spring攻略(第2版)》——1.9 用依赖检查属性