通过 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 框架首先将 Barinjects 的实例创建为 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; }
}