Spring5参考指南参考指南:依赖注入依赖注入
依赖注入
依赖注入就是在Spring创建Bean的时候,去实例化该Bean构造函数所需的参数,或者通过Setter方法去设置该Bean的属性。
Spring的依赖注入有两种基于构造函数的依赖注入和基于setter的依赖注入。
基于构造函数的依赖注入
构造函数的注入是通过构造函数的参数来实现的。如下所示:
该Bean有一个两个参数的构造函数,那么怎么注入这些参数呢?
有三种方法。
方法1:按构造函数的类型匹配:
这里通过指定参数的类型,即可以指定哪个参数是years,哪个参数是ultimateAnswer。
方法2:构造函数索引:
Spring中可以通过构造函数的索引来指定特定的参数。要注意Spring的索引是从0开始的。
方法3:构造函数名字匹配:
如果通过构造函数的名字来匹配,需要注意必须在编译的时候开启调试标志,要不然Spring不能在构造函数中找到参数名。
如果不想启用调试标志,则必须使用@ConstructorProperties JDK注解显式命名构造函数参数。
基于Setter的注入
Setter注入主要用来无参构造器或者获得对象实例之后才设置对象的属性。下面是Setter的例子:
对于的XML文件如下:
除了XML配置,也可以使用注解:@Component、@Controller。或者使用@Configuration注解中的@Bean方法。
如何选择?
既然有这样两种注入方式,我们怎么选择呢?
通常来说,对于必须的属性,我们通过构造函数来注入。对于可选属性,我们通过Setter注入。当然你也可以在Setter方法中
使用@Required注解。
当然如果第三方类不公开任何setter方法,那么构造函数注入可能是DI的唯一可用形式。
循环依赖
循环依赖主要出现在构造函数注入的情况。
类A通过构造函数注入需要类B的实例,类B通过构造函数注入需要类A的实例。如果为要相互注入的类A和类B配置bean,那
么SpringIOC容器在运行时检测到这个循环引用,会抛出BeanCurrentlyInCreationException。
解决方式就是使用Setter注入。
依赖注入的配置详解
基本类型,字符串或者其他
如果< property/>元素的value属性是基本类型,Spring会将其转换为类需要的类型,配置如下:
这是一个常见的Setter注入。为了简洁,也可以使用p-namespace,如下:
Spring容器使用JavaBeans属性编辑器机制将< value/>元素中的文本转换为java.util.properties实例。这是一个很好的快捷方
式,如下所示:
注意上面例子中的value里面的值。
ref