1.9 用依赖检查属性
1.9.1 问题
在大规模的应用中,IoC容器中可能声明了几百个或者几千个Bean,这些Bean之间的依赖往往非常复杂。设值方法注入的不足之一是无法确定一个属性将会被注入。检查所有必要的属性是否已经设置是非常困难的。
1.9.2 解决方案
Spring的依赖检查功能能够帮助你检查在一个Bean上的所有特定类型属性是否都已经设置。你只要在的dependency-check属性中指定依赖检查模式就可以了。注意,依赖检查功能只能检查属性是否已经设置,而无法检查它们的值是否非空。表1-1列出了Spring支持的所有依赖检查模式。
*默认模式为none,但是可以设置根元素的default-dependency-check属性来改变。如果Bean指定了自己的模式,默认模式将被覆盖。你必须小心设置这个属性,因为它将改变IoC容器中的所有Bean的默认依赖检查模式。
1.9.3 工作原理
检查简单类型属性
假定序列生成器的suffix属性没有设置。那么生成器将生成后缀为空字符串的序列号。这种问题通常很难调试,特别是在复杂的Bean中。幸运的是,Spring能够检查所有特定类型的属性是否已经设置。为了要求Spring检查简单类型(也就是原始类型和集合类型)的属性,将的dependency-check属性设置为simple。
<bean id="sequenceGenerator"
class="com.apress.springrecipes.sequence.SequenceGenerator"
dependency-check="simple">
<property name="initial" value="100000" />
<property name="prefixGenerator" ref="datePrefixGenerator" />
</bean>
如果任何这些类型的属性没有设置,就会抛出UnsatisfiedDependencyException异常,指出未设置的属性。
Exception in thread "main"
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating
bean with name 'sequenceGenerator' defined in class path resource [beans.xml]:
Unsatisfied dependency expressed through bean property 'suffix': Set this property
value or disable dependency checking for this bean.
检查对象类型的属性
如果前缀生成器未被设置,请求它的时候将会抛出讨厌的NullPointerException异常。为了使依赖检查能检查对象类型(也就是简单类型之外的)的Bean属性,将dependency-check属性改为objects。
<bean id="sequenceGenerator"
class="com.apress.springrecipes.sequence.SequenceGenerator"
dependency-check="objects">
<property name="initial" value="100000" />
<property name="suffix" value="A" />
</bean>
当你运行应用程序时,Spring将通知你prefixGenerator属性未设置。
Exception in thread "main"
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating
bean with name 'sequenceGenerator' defined in class path resource [beans.xml]:
Unsatisfied dependency expressed through bean property 'prefixGenerator': Set this
property value or disable dependency checking for this bean.
检查所有类型属性
如果你想检查任何类型的所有Bean属性,可以将dependency-check属性改为all。
<bean id="sequenceGenerator"
class="com.apress.springrecipes.sequence.SequenceGenerator"
dependency-check="all">
<property name="initial" value="100000" />
</bean>
依赖检查和构造程序注入
Spring的依赖检查功能只检查属性是否通过设值方法注入。所以,即使你已经通过构造程序注入了前缀生成器,仍然会抛出UnsatisfiedDependencyException异常。
<bean id="sequenceGenerator"
class="com.apress.springrecipes.sequence.SequenceGenerator"
dependency-check="all">
<constructor-arg ref="datePrefixGenerator" />
<property name="initial" value="100000" />
<property name="suffix" value="A" />
</bean>