在Spring
中怎样较好地创建对象是很重要的,常见的是依赖注入是对对象定义其依赖的过程。当容器在创建bean的时候会注入依赖。
常见的依赖注入有基于构造器的依赖注入、Setter
注入、静态工程方法注入。
基于构造器的依赖注入
通过容器利用携带一些参数的构造器来完成基于构造器的依赖注入,其中构造器的每一个参数就表示一个依赖。
public class SimpleMovieLister{
// the SimpleMovieLister has a dependency on a MovieFinder
private final MovieFinder movieFinder;
// a constructor so that the Spring container can inject a MovieFinder
public SimpleMovieLister(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
}
通过构造器,Spring
容器可以实现注入MovieFinder
。
但是要注意构造器参数的判断!!!
packege x.y;
public class ThingOne {
public ThingOne(ThingTwo thingTwo, ThingThree thingThree) {
// ...
}
}
<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>
如上所示,如果bean
定义的构造函数参数中不存在潜在的歧义,那么在bean
定义中定义构造函数参数的顺序就是在实例化bean
时将这些参数提供给相应构造函数的顺序。
如上所示,在知道引用类型的情况下,可使用顺序来进行构造,但是当Spring
不知道值的类型时,此时是无法通过类型进行匹配。如下所示:
package examples;
public class ExampleBean {
// Number of years to calculate the Ultimate Answer
private final int years;
// The Answer to Life, the Universe, and Everything
private final String ultimateAnswer;
public ExampleBean(int years, String ultimateAnswer) {
this.years = years;
this.ultimateAnswer = ultimateAnswer;
}
}
此时需要手动告诉类型
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg type="int" vlaue="750000"/>
<constructor-arg type="java.lang.String" value="42"/>
</bean>
也可以设置索引,但是索引需要从0
开始。
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg index="0" value="7500000"/>
<constructor-arg index="1" value="42"/>
</bean>
还可以直接用name
,但是这种方式需要在编译代码时启用调试标志,以便Spring
可以从构造函数中查找参数名。
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg name="years" value="7500000"/>
<constructor-arg name="ultimateAnswer" value="42"/>
</bean>
如果不启动调试标志,可使用@ConstructorProperties JDK
注解显式命名构造函数参数。
package examples;
public class ExampleBean {
// Fields omitted
@ConstructorProperties({"years", "ultimateAnswer"})
public ExampleBean(int years, String ultimateAnswer) {
this.years = years;
this.ultimateAnswer = ultimateAnswer;
}
}