Setter注入和构造器注入各自适用于不同的使用场景,下面通过具体的示例来说明它们的使用场景区别。
Setter注入的使用场景:
1. 可选依赖: 当一个类有多个依赖项,而不是所有的依赖项都是必须的时候,Setter注入是一个不错的选择。可以只注入那些需要的依赖项,而将其他依赖项保持为null或默认值。
示例: 一个Computer
类依赖于Keyboard
和Mouse
,但是Mouse
是可选的,可以通过Setter注入。
public class Computer {
private Keyboard keyboard;
private Mouse mouse;
public void setKeyboard(Keyboard keyboard) {
this.keyboard = keyboard;
}
public void setMouse(Mouse mouse) {
this.mouse = mouse;
}
}
<bean id="computer" class="com.example.Computer">
<property name="keyboard" ref="keyboard" />
<!-- Mouse是可选的,可以不设置 -->
</bean>
2. 动态修改依赖: 当依赖项可能在对象生命周期内动态变化时,Setter注入允许在任何时候修改依赖关系。
示例: 一个ConnectionManager
类可能会在运行时切换数据库连接。
public class ConnectionManager {
private DataSource dataSource;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}
构造器注入的使用场景:
1. 必须依赖: 当一个类的依赖项是必须的,而且在对象创建时就需要将所有必须的依赖项传递进来时,使用构造器注入。
示例: 一个Car
类依赖于Engine
和Transmission
,没有这些依赖项就无法创建Car
对象。
public class Car {
private Engine engine;
private Transmission transmission;
public Car(Engine engine, Transmission transmission) {
this.engine = engine;
this.transmission = transmission;
}
}
<bean id="car" class="com.example.Car">
<constructor-arg ref="engine" />
<constructor-arg ref="transmission" />
</bean>
2. 不可变性: 当对象创建后,依赖关系不应该再发生变化时,使用构造器注入,可以确保对象的不可变性。
示例: 一个ImmutableClass
类的依赖关系在构造时就被固定,之后不可再修改。
public class ImmutableClass {
private final Dependency dependency;
public ImmutableClass(Dependency dependency) {
this.dependency = dependency;
}
}
在实际应用中,通常会根据具体需求选择Setter注入或构造器注入,有时候也会结合使用,以满足不同依赖关系的处理。