Spring框架中构造器注入和Setter注入的区别
依赖注入是一种将依赖对象传递给其他对象的实践。Spring有两种类型的依赖注入
基于构造函数的注入 - 当容器调用类的构造函数时。它应该用于强制依赖。
假设类X紧密依赖于类Y,那么我们应该使用基于构造函数的注入。
基于Setter的注入 - 它可以通过调用bean上的setter方法来使用。它应该用于可选依赖。
两种注入类型各有优缺点。下面列出了一些区别:
| 序号 | 关键点 | 基于构造函数的注入 | 基于Setter的注入 |
|---|---|---|---|
| 1 | 循环依赖 | 它不允许创建循环依赖 | 它不检查循环依赖 |
| 2 | 顺序 | 基于构造函数的DI确定了需要注入依赖项的顺序。 | 基于Setter的DI帮助我们仅在需要时注入依赖项,而不是在构造时就需要它。 |
| 3 | 多线程环境 | 结合final字段,构造函数注入在多线程环境中提供了额外的安全性 | Setter注入没有额外的好处 |
| 4 | Spring代码生成库 | Spring代码生成库不支持构造函数注入,因此它将无法创建代理。它将强制您使用无参数构造函数。 | Spring框架级别的代码使用Setter注入 |
| 5 | 用例 | 它应该用于强制依赖 | 它应该用于可选依赖。 |
构造函数注入示例
public class ConstructorInjectionExample {
public ConstructorInjectionExample(BaseExmp baseExmp) {
// ...
}
}
<beans>
<bean id = "ConstructorInjectionExample" class = "x.y.ConstructorInjectionExample">
<constructor-arg ref = "baseExmp"/>
</bean>
<bean id = "baseExmp" class = "x.y.BaseExmp"/>
</beans>Setter注入示例
public class SetterInjectionExample {
public void setBaseExmp(BaseExmp baseExmp) {
this.baseExmp = baseExmp;
}
}
<beans>
<bean id = "setterInjectionExample" class = "x.y.SetterInjectionExample">
<property name = "baseExmp" ref = "baseExmp"/>
</bean>
</beans>
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP