通过 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; }
}