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>

更新于:2020年9月9日

2万+浏览量

启动你的职业生涯

通过完成课程获得认证

开始学习
广告