通过 XML 配置手动注入依赖项
考虑以下 Java 类:
class Foo {
private Bar bar;
public void foo() {
bar.baz();
}
}
可以看出,类 Foo 需要在另一个类 Bar 的实例上调用方法 baz,以使其方法 foo 能够成功运行。据说 Bar 是对 Foo 的依赖,因为如果没有 Bar 实例,Foo 就无法正常工作。
构造函数注入
当使用 Spring 框架的 XML 配置来定义 Spring 管理的 bean 时,可以按如下方式配置 Foo 类型的 bean:
<bean class="Foo">
<constructor-arg>
<bean class="Bar" />
</constructor-arg>
</bean>
或者,(更详细):
<bean id="bar" class="bar" />
<bean class="Foo">
<constructor-arg ref="bar" />
</bean>
在这两种情况下,Spring 框架首先将 Bar 和 injects 的实例创建为 Foo 的实例。此示例假定类 Foo 具有可以将 Bar 实例作为参数的构造函数,即:
class Foo {
private Bar bar;
public Foo(Bar bar) { this.bar = bar; }
}
这种样式称为**构造函数注入,**因为依赖项(Bar 实例)是通过类构造函数注入的。
属性注入
将 Bar 依赖注入 Foo 的另一个选择是:
<bean class="Foo">
<property name="bar">
<bean class="Bar" />
</property>
</bean>
或者,(更详细):
<bean id="bar" class="bar" />
<bean class="Foo">
<property name="bar" ref="bar" />
</bean>
这要求 Foo 类具有接受 Bar 实例的 setter 方法,例如:
class Foo {
private Bar bar;
public void setBar(Bar bar) { this.bar = bar; }
}