Spring 中有两种依赖注入的方法,一种是setter注入,一种是构造器注入,多是使用setter注入。
依赖注入:
每个bean中多多少少都有一些私有变量,这是与bean一起工作的其他对象,这些对象与bean之间的关系是依赖关系,什么依赖关系,就是bean没了就这些对象也就没了。然而,
每个bean中的私有变量的实例化不是由bean来控制的,而且通过Spring容器来控制的,在bean创建的时候,由容器注入这些依赖关系,控制从根本上发生了反转,这也叫做控制反转(IOC)。
构造器注入:
每个构造器参数代表一个依赖,每个依赖可以是另一个bean或者是一个值。
假如A和B都是一个bean,现在用构造器给A注入B
package x.y;
public class A {
private B b;
private int i;
private String j;
public A(B b, int i, String j) {
this.b = b;
this.i = i;
this.j = j;
}
}
<bean id="B" class="x.y.B"/>
<bean id="A" class="x.y.A">
<!--第一种配置-->
<constructor-arg>
<ref bean="B">
</constructor-arg>
<!--第二种配置-->
<constructor-arg ref="B" />
<constructor-arg index="0" value="1">
<constructor-arg index="1" value="2">
</bean>
可以看到第一个依赖是一个bean,第二和第三都是一个值,只是简单类型不一样,Spring的<value>true</value>所以spring无法识别该值的类型。这时可以借助索引或者type类型来解决简单类型的混淆问题,index必须从0开始。如果有两个构造器参数都是bean,就不会有这种混淆的情况
public A(B b, C c) {
this.b=b;
this.c=c;
}
<constructor-arg>
<bean class="x.y.B"/>
</constructor-arg>
<constructor-arg>
<bean class="x.y.C"/>
</constructor-arg>
如果使用setter注入就不会出现这种情况
setter注入:
package x.y;
public class A {
private B b;
private C c;
private String j;
public A(B b, C c, String j) {
this.b = b;
this.c = c;
this.j = j;
}
}
<bean id="B" class="x.y.B"/>
<bean id="C" class="x.y.C"/>
<bean id="A" class="x.y.A">
<!--bean第一种配置-->
<property name="b" ref="B" />
<!--bean第二种配置-->
<property name="c">
<ref bean="C"/>
</property>
<property name="StringValue" value="1" />
</bean>