📜  Spring构造函数和Setter注入之间的区别(1)

📅  最后修改于: 2023-12-03 14:47:34.508000             🧑  作者: Mango

Spring构造函数和Setter注入之间的区别

在Spring框架中,我们使用依赖注入(Dependency Injection)来实现对象之间的松耦合。依赖注入本质上就是为对象提供需要的依赖项(例如其他对象、配置值等),而这些依赖项由容器在运行期间提供。Spring提供了两种实现依赖注入的方式——构造函数注入和Setter注入。

构造函数注入

构造函数注入是通过目标对象的构造函数来注入依赖项的方式。在Spring框架中,我们需要在目标对象的构造函数中声明需要注入的依赖项。示例代码如下:

public class Foo {
    private Bar bar;

    public Foo(Bar bar) {
        this.bar = bar;
    }

    // ...
}

在以上代码中,我们通过在Foo的构造函数中声明需要注入的Bar对象,来实现了构造函数注入。

Setter注入

Setter注入是通过目标对象的Setter方法来注入依赖项的方式。在Spring框架中,我们需要在目标对象的类中声明Setter方法来接收需要注入的依赖项。示例代码如下:

public class Foo {
    private Bar bar;

    public void setBar(Bar bar) {
        this.bar = bar;
    }

    // ...
}

在以上代码中,我们通过在Foo类中声明一个名为setBar()的Setter方法,来实现了Setter注入。

两者区别
  • 构造函数注入需要在目标对象的构造函数中声明需要注入的依赖项,因此在创建目标对象时,所有的依赖项都必须满足条件。而Setter注入则不需要,因此可以在创建目标对象后,通过Setter方法随时注入依赖项。
  • 构造函数注入可以让依赖项变成不可变的,从而增强了程序的可靠性和安全性。而Setter注入则不能实现这个目标,依赖项仍然是可变的。
  • 构造函数注入不需要目标对象提供默认构造函数,因为所有的依赖项通过构造函数来实现。而Setter注入则需要目标对象提供默认构造函数,因为Setter方法是在目标对象创建后调用的。
总结

在实现依赖注入时,我们可以根据需求选择构造函数注入或Setter注入。如果需要让依赖项变成不可变的,增强程序的可靠性和安全性,那么可以使用构造函数注入。否则,我们可以使用Setter注入。