Spring框架学习之依赖注入(DI)

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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容