依赖注入(DI)是对象定义它们依赖的方式,可以分为构造器注入和setter注入两种。本文介绍构造器注入。
public class SimpleMovieLister {
// the SimpleMovieLister has a dependency on a MovieFinder
private MovieFinder movieFinder;
// a constructor so that the Spring container can inject a MovieFinder
public SimpleMovieLister(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// business logic that actually uses the injected MovieFinder is omitted...
}
简单来讲,构造器注入,就是容器调用类的构造函数,来完成对象的初始化。
构造函数参数的解决
默认使用构造函数参数的类型进行匹配。考虑下面的例子。
package x.y;
public class ThingOne {
public ThingOne(ThingTwo thingTwo, ThingThree thingThree) {
// ...
}
}
xml配置如下,即可完成对ThingOne的构造器注入。
<beans>
<bean id="beanOne" class="x.y.ThingOne">
<constructor-arg ref="beanTwo"/>
<constructor-arg ref="beanThree"/>
</bean>
<bean id="beanTwo" class="x.y.ThingTwo"/>
<bean id="beanThree" class="x.y.ThingThree"/>
</beans>
当构造函数参数类型为基本类型,比如int,String时,spring无法通过xml中的值来确定它的类型,所以我们需要在xml中增加额外的信息,帮助spring完成注入。有3种方式,可以帮助spring完成工作。
方式1,指定参数的类型。如下。
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg type="int" value="7500000"/>
<constructor-arg type="java.lang.String" value="42"/>
</bean>
方式2,指定参数的顺序。如下。
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg index="0" value="7500000"/>
<constructor-arg index="1" value="42"/>
</bean>
方式3,指定参数的名称,如下。
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg name="years" value="7500000"/>
<constructor-arg name="ultimateAnswer" value="42"/>
</bean>