《Spring攻略(第2版)》——1.9 用依赖检查属性

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>
时间: 2024-10-29 18:03:18

《Spring攻略(第2版)》——1.9 用依赖检查属性的相关文章

《Spring攻略(第2版)》——导读

前言 Spring框架正在成长.它始终与选择相关.Java EE关注于少数几项技术,很大程度上阻碍了更好的替代解决方案出现.当Spring框架出现时,没有多少人还会承认Java EE是当今最佳的架构. 随后Spring被大张旗鼓地推出,因为它寻求简化Java EE.此后其每个版本都引入设计用来简化和实现解决方案的新特性. 从2.0版本之后,Spring框架开始针对多平台.和往常一样,该框架提供了现有平台之上的服务,但是尽可能去除与底层平台的耦合.Java EE仍然是主要的参考点,但是不是唯一的目

阿里妈妈联盟申请注册攻略(站长版)

中介交易 SEO诊断 淘宝客 云主机 技术大厅 阿里妈妈注册攻略(站长版) 阿里妈妈面世已经快一个月了,有很多朋友对于阿里妈妈的注册以及发布广告位流程不是很清楚.特别是作为 卖家,对于发布广告位之类的操作了解不多,特发布注册秘笈,以帮助大家更好的理解阿里妈妈的运作流程. 整体来说,要想成功在阿里妈妈注册,需要完成三个步骤: 一.注册成为阿里妈妈的会员 二.登记网站并发布广告位 三.投放广告代码 注意:上面这三个步骤主要是针对卖家在阿里妈妈出售广告位. 话不多说,开始注册了! 第一部分 注册成为阿

《Spring攻略(第2版)》——1.11 用XML配置自动装配Bean

1.11 用XML配置自动装配Bean 1.11.1 问题 当一个Bean需要访问另一个Bean时,你可以显式指定引用装配它.但是,如果你的容器能够自动装配Bean,就可以免去手工配置装配的麻烦. 1.11.2 解决方案 Spring IoC容器能够帮助你自动装配Bean.你只要在的autowire属性中指定自动装配模式就可以了.表1-2列出了Spring支持的自动装配模式. *默认模式是no,但是可以设置根元素的default-autowire属性修改.这个默认模式将被Bean自己指定的模式覆

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

1.10 用@Required注解检查属性 1.10.1 问题Spring的依赖检查功能仅能检查某些类型的所有属性.它的灵活性不够,不能仅检查特定的属性.在大部分情况下,你希望检查特定的属性是否设置,而不是特定类型的所有属性. 1.10.2 解决方案RequiredAnnotationBeanPostProcessor是一个Spring bean后处理器,检查带有@Required注解的所有Bean属性是否设置.Bean后处理器是一类特殊的Spring bean,能够在每个Bean初始化之前执行

《Spring攻略(第2版)》——1.15 小结

1.15 小结 在本章中,你已经学习了Spring IoC容器中的基本Bean配置.Spring支持多种Bean配置.在这些配置中,XML是最简单和最自然的.Spring提供两种IoC容器实现.基本的实现是Bean工厂,高级的实现是应用程序上下文.如果可能,你应该使用应用程序上下文,除非资源有限.Spring支持用Setter注入和构造程序注入定义Bean属性,属性可以是简单值.集合或者Bean引用. 依赖检查和自动装配是Spring提供的两种有价值的容器特性.依赖检查帮助检查所有必要的属性是否

《Spring攻略(第2版)》——1.2 配置Spring IoC容器中的Bean

1.2 配置Spring IoC容器中的Bean 1.2.1 问题 Spring提供了一个强大的IoC容器来管理组成应用的bean.为了利用容器服务,你必须配置运行于Spring IoC容器中的Bean. 1.2.2 解决方案 你可以通过XML文件.属性文件.注释甚至API来配置Spring IoC容器中的Bean. Spring允许你在一个或者多个bean配置文件中配置bean.对于简单的应用程序,可以在单个配置文件中集中配置bean.但是对于有许多bean的大型应用,你应该根据其功能(例如控

《Spring攻略(第2版)》——1.5 指定Bean引用

1.5 指定Bean引用 1.5.1 问题 组成应用程序的Bean往往需要互相协作完成应用功能.为了Bean之间的相互访问,你必须在Bean配置文件中指定Bean引用. 1.5.2 解决方案 在Bean配置文件中,你可以用元素为Bean属性或者构造程序参数指定Bean引用.只需要用元素指定一个简单值就可以轻松完成这一工作.你也可以像内部Bean一样直接地在属性或者构造程序中包含一个Bean声明. 1.5.3 工作原理 在你的序列生成器中接受字符串值作为前缀的灵活性不足以满足将来的要求.如果前缀生

《Spring攻略(第2版)》——1.12 用@Autowired和@Resource自动装配Bean

1.12 用@Autowired和@Resource自动装配Bean 1.12.1 问题 在Bean配置文件中设置autowire属性进行的自动装配将装配一个Bean的所有属性.这样的灵活性不足以仅仅装配特定的属性.而且,你只能通过类型或者名称自动装配Bean.如果这两种策略都不能满足你的需求,就必须明确地装配Bean. 1.12.2 解决方案 从Spring 2.5起,自动装配功能进行了多处改进.你可以通过用@Autowired或者@Resource(在JSR-250:Java平台常见注解中定

《Spring攻略(第2版)》——1.6 为集合元素指定数据类型

1.6 为集合元素指定数据类型 1.6.1 问题 默认情况下,Spring将集合中所有元素作为字符串对待.如果你不打算将集合元素作为字符串使用,就必须为它们指定数据类型. 1.6.2 解决方案 你可以用标记的type属性指定每个集合元素的数据类型,也可以用集合标记的value-type属性指定所有元素的数据类型.如果你使用Java 1.5或者更高版本,可以定义类型安全的集合,这样Spring将读取集合的类型信息. 1.6.3 工作原理 现在假定你打算接受一系列整数作为序列生成器的前缀.每个数字将