Setter注入和构造器注入分别是什么,区别在哪里?

在 Spring 中,依赖注入(Dependency Injection, DI)是实现控制反转(IoC)的核心机制,常用的依赖注入方式有两种:​Setter 注入 和 ​构造器注入

Setter注入:

Setter 注入是通过调用 Bean 的 Setter 方法来完成依赖注入的。Spring 容器在创建 Bean 后,会调用相应的 Setter 方法将依赖的 Bean 注入到目标 Bean 中。

代码示例:

@Component
public class BeanA {
    private BeanB beanB;

    @Autowired
    public void setBeanB(BeanB beanB) { // Setter 方法
        this.beanB = beanB;
    }
}
特点:
  • 灵活性:可以在 Bean 创建后动态地注入依赖。
  • 可选性:依赖是可选的,即使不注入也不会导致 Bean 创建失败。
  • 顺序性:依赖注入的顺序由 Spring 容器决定,而不是由代码逻辑决定。

2. ​构造器注入

构造器注入是通过调用 Bean 的构造函数来完成依赖注入的。Spring 容器在创建 Bean 时,会通过构造函数将依赖的 Bean 注入到目标 Bean 中。

示例代码:

@Component
public class BeanA {
    private final BeanB beanB;

    @Autowired
    public BeanA(BeanB beanB) { // 构造函数
        this.beanB = beanB;
    }
}
特点:
  • 不可变性:依赖通常是 final 的,确保了依赖在 Bean 生命周期内不可变。
  • 强制性:依赖是强制的,如果依赖无法注入,Bean 创建会失败。
  • 明确性:依赖关系在构造函数中明确声明,便于理解和维护。

主要区别:

特性Setter注入构造器注入
依赖的可变性依赖可以动态修改依赖通常是fianl 不可修改
依赖的强制性可选,可以不注入强制的,必须注入
代码可读性依赖关系分散在多个Setter方法中依赖关系集中在构造函数中,更清晰
循环依赖问题通过三级缓存解决通过@Lazy注解解决

总结

  • Setter 注入:灵活、可选,适合动态修改依赖的场景。
  • 构造器注入:强制、不可变,适合大多数场景,是 Spring 官方推荐的方式。
  1. 强制依赖使用构造器注入,使用Setter注入有概率不进行注入导致null对象出现。
  2. 可先依赖使用setter注入,灵活性强。
  3. pring 官方推荐构造器注入。第三方框架内部大多使用构造器注入的形式进行数据初始化,相对严谨。
  4. 自己开发的模块推荐使用Setter注入
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值