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

简介: Spring的依赖检查功能能够帮助你检查在一个Bean上的所有特定类型属性是否都已经设置。你只要在的dependency-check属性中指定依赖检查模式就可以了。注意,依赖检查功能只能检查属性是否已经设置,而无法检查它们的值是否非空。表1-1列出了Spring支持的所有依赖检查模式。

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

1.9 用依赖检查属性

1.9.1 问题
在大规模的应用中,IoC容器中可能声明了几百个或者几千个Bean,这些Bean之间的依赖往往非常复杂。设值方法注入的不足之一是无法确定一个属性将会被注入。检查所有必要的属性是否已经设置是非常困难的。

1.9.2 解决方案
Spring的依赖检查功能能够帮助你检查在一个Bean上的所有特定类型属性是否都已经设置。你只要在的dependency-check属性中指定依赖检查模式就可以了。注意,依赖检查功能只能检查属性是否已经设置,而无法检查它们的值是否非空。表1-1列出了Spring支持的所有依赖检查模式。
screenshot
*默认模式为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>
相关文章
|
1月前
|
XML 缓存 Java
Spring源码之 Bean 的循环依赖
循环依赖是 Spring 中经典问题之一,那么到底什么是循环依赖?简单说就是对象之间相互引用, 如下图所示: 代码层面上很好理解,在 bean 创建过程中 class A 和 class B 又经历了怎样的过程呢? 可以看出形成了一个闭环,如果想解决这个问题,那么在属性填充时要保证不二次创建 A对象 的步骤,也就是必须保证从容器中能够直接获取到 B。 一、复现循环依赖问题 Spring 中默认允许循环依赖的存在,但在 Spring Boot 2.6.x 版本开始默认禁用了循环依赖 1. 基于xml复现循环依赖 定义实体 Bean java复制代码public class A {
|
2月前
|
存储 缓存 Java
明知面试要问spring循环依赖,很多人还是搞不懂!
Spring中的循环依赖一直是Spring中一个很重要的话题,一方面是因为源码中为了解决循环依赖做了很多处理,另外一方面是因为面试的时候,如果问到Spring中比较高阶的问题,那么循环依赖必定逃不掉。如果你回答得好,那么这就是你的必杀技,反正,那就是面试官的必杀技,这也是取这个标题的原因,当然,本文的目的是为了让你在之后的所有面试中能多一个必杀技,专门用来绝杀面试官!
33 0
|
7天前
|
存储 缓存 Java
Spring解决循环依赖
Spring解决循环依赖
|
13天前
|
JSON Java 数据库连接
属性注入掌握:Spring Boot配置属性的高级技巧与最佳实践
属性注入掌握:Spring Boot配置属性的高级技巧与最佳实践
22 1
|
23天前
|
缓存 算法 Java
开发必懂的Spring循环依赖图解 Spring 循环依赖
开发必懂的Spring循环依赖图解 Spring 循环依赖
18 1
|
27天前
|
缓存 算法 Java
Spring解决循环依赖
Spring解决循环依赖
19 0
|
1月前
|
Java 开发者 Spring
【Java】Spring循环依赖:原因与解决方法
【Java】Spring循环依赖:原因与解决方法
39 0
|
1月前
|
Java 数据库连接 Spring
Spring Boot 3.2.2整合MyBatis-Plus 3.5.5依赖不兼容问题
Spring Boot 3.2.2整合MyBatis-Plus 3.5.5依赖不兼容问题
47 0
|
1月前
|
消息中间件 运维 监控
|
2月前
|
缓存 Java Spring