在生产规模的应用程序中,IoC容器中可能会有数百或数千个bean,并且它们之间的依赖关系通常非常复杂。setter注入的一个缺点是你很难检查是否已经设置了所有必需的属性。使用“ dependency-check”属性<bean>可以检查属性值是否已设置,但无法检查其值是否设置为nullnon-null值。

除了使用验证依赖项之外dependency-check,您还可以使用@Required注释来检查是否设置了值non-null

如何使用@Required注释

1)在setter方法上使用@Required注释

@Required在类文件中使用bean属性的setter方法的注释如下:

EmployeeFactoryBean.java

public class EmployeeFactoryBean extends AbstractFactoryBean<Object>

{

    private String designation;

     

    public String getDesignation() {

        return designation;

    }

 

    @Required

    public void setDesignation(String designation) {

        this.designation = designation;

    }

     

    //more code here

}

2)注册RequiredNennotationBeanPostProcessor类

RequiredAnnotationBeanPostProcessor是一个spring bean post处理器,它检查是否@Required已设置带有注释的所有bean属性。要启用此Bean post处理器以进行属性检查,必须在Spring IoC容器中注册它。

applicationContext.xml

<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>

演示

如果@Required尚未设置任何属性,则BeanInitializationException此bean后处理器将抛出a 。例如,如果我将创建一个EmployeeFactoryBean类的实例而不传递属性值进行指定,那么我将得到此错误。

applicationContext.xml

<bean id="manager"  class="com.howtodoinjava.demo.factory.EmployeeFactoryBean">

    <!-- <property name="designation" value="Manager" /> -->

</bean>

 

<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>

它会抛出错误。

Console

Caused by: org.springframework.beans.factory.BeanInitializationException: Property 'designation'is required for bean 'manager'

    at org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor.postProcessPropertyValues(RequiredAnnotationBeanPostProcessor.java:156)

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1202)

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)

    ... 11 more

要解决此问题,请通过取消注释applicationContext.xml文件中的行来传递指定值。

通过这种方式,您可以使用@Required注释和RequiredAnnotationBeanPostProcessor类来验证在上下文初始化时,已正确设置了所有必需的bean属性。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐