【Spring学习笔记】3:依赖注入(DI),控制反转(IoC),配置依赖注入,内部Bean,集合注入,空注入

依赖注入

依赖指的是一个类中使用了属性,这些属性就是这个类的依赖。依赖可以是对象也可以是值。

依赖注入(DI)就是将一个类的依赖传递给它,一般“依赖”说的都是依赖的对象。

下面这种方式就不是依赖注入的,而是由类自己去把自己的成员实例化了。

public class A{
    private B b;
    public A(){
        b=new B();
    }
}

下面这种方式就是依赖注入的,而且是通过构造器注入的。对象b的实例化显然在类A的外部,通过注入传递了进来。

public class A{
    private B b;
    public A(B b){
        this.b=b;
    }
}

控制反转

控制反转(IoC)就是将创建对象的工作交给IoC容器框架,而不是自己来做。它是建立在DI之上的(一说DI即IoC),IoC容器实例化了要注入的对象,通过DI注入给需要这个对象的对象中,由IoC框架来管理DI和做DI。

Spring中就是通过配置<beans .../>的xml文件和框架提供的一系列接口来实现IoC的。

显然IoC能提高可重用性,解耦合,使系统更易于扩展。

DI的配置

基于构造器的DI

<bean .../>下使用<constructor-arg .../>来配置基于构造器的DI。

如使用另一个bean的id即使用了其创建的对象作为自己构造器中注入的一个形参:

<constructor-arg ref="另一个bean的id"/>

一个constructor-arg只能配出构造器中注入的一个参数,当构造器中要传入多个参数时需要按形参表顺序一个一个配:

<constructor-arg ref="..."/>
<constructor-arg ref="..."/>

所以在属性的注入有顺序要求时,构造器DI会比setter DI有优势。

传递值类型的参数时可以指定类型:

...
<constructor-arg type="java.lang.String" value="垃圾刘知昊"/>
...

也可以显式指定参数位置而不指定type:

<constructor-arg index="0" value="垃圾傻逼"/>
<constructor-arg index="1" value="垃圾LZH"/>
...

基于setter的DI

<bean .../>下使用<property... />来配置基于setter的DI。一个<property... />的配置就相当于实例化外面这个bean之前要调用一次对应的setter。

传值类型:

 <property name="值类型属性名" value="要传进来的值"/>

传引用类型:

 <property name="引用类型属性名" ref="另一个bean的id"/>

简洁的p-namespace混合形式:

<bean id="..." class="..."
    p:值类型属性名="要传进来的值"
    p:引用类型属性名-ref="另一个bean的id"/>
</bean>

内部Bean

内部Bean配置在其它Bean的某些属性中,其作用范围就仅限外层属性。如果一个类只被某个bean使用,可以考虑配置在这个bean里面,简洁明了。

如:

<bean id="..." class="...">
    <property name="sbLzh">
        <bean id="sbLzh" class="myBean.Student"/>
    </property>
</bean>

集合注入

ListSetMapProperties接口类型的属性,在注入时使用特殊的集合注入。即对于有name属性的<property .../>打开为双标签,使用<list><set><map><props>双标签包含值来配置。

集合里存的是值类型

配置List:

<property name="List属性名">
    <list>
        <value>...</value>
        ...
    </list>
</property>

配置Set:

<property name="Set属性名">
    <set>
        <value>...</value>
        ...
    </set>
</property>

配置Map:

<property name="Map属性名">
    <map>
        <entry key="..." value="..."/>
        ...
    </map>
</property>

配置Properties:

<property name="Properties属性名">
    <props>
        <prop key="...">...</prop>
        ...
    </props>
</property>

集合里存的是引用类型

配置List:

<property name="List属性名">
    <list>
        <ref bean="另一个bean的id"/>
        ...
    </list>
</property>

配置Set:

<property name="Set属性名">
    <set>
        <ref bean="另一个bean的id"/>
        ...
    </set>
</property>

配置Map:

<property name="Map属性名">
    <map>
        <entry key="..." value-ref="另一个bean的id"/>
        ...
    </map>
</property>

空注入

空串注入:

<property name="字符串类型属性名" value=""/>

null注入:

<property name="引用类型属性名"><null/></property>

猜你喜欢

转载自blog.csdn.net/shu15121856/article/details/80173932