依赖注入(DI)

依赖:备案对象的创建依赖于容器。

注入:bean对象中的所有属性,由容器来注入。

1. 构造器注入

参见Spring -> Inversion of Control -> IoC创建对象的方式。

2. Set方式注入

2.1. 普通类型的注入方式

<bean id="outer" class="...">
    <!-- instead of using a reference to a target bean, simply define the target bean inline -->
    <property name="target">
        <bean class="com.example.Person"> <!-- this is the inner bean -->
            <property name="name" value="Fiona Apple"/>
            <property name="age" value="25"/>
        </bean>
    </property>
</bean>

2.2. Properties、List、Map、Set的注入方式

<bean id="moreComplexObject" class="example.ComplexObject">
    <!-- results in a setAdminEmails(java.util.Properties) call -->
    <property name="adminEmails">
        <props>
            <prop key="administrator">administrator@example.org</prop>
            <prop key="support">support@example.org</prop>
            <prop key="development">development@example.org</prop>
        </props>
    </property>
    <!-- results in a setSomeList(java.util.List) call -->
    <property name="someList">
        <list>
            <value>a list element followed by a reference</value>
            <ref bean="myDataSource" />
        </list>
    </property>
    <!-- results in a setSomeMap(java.util.Map) call -->
    <property name="someMap">
        <map>
            <entry key="an entry" value="just some string"/>
            <entry key ="a ref" value-ref="myDataSource"/>
        </map>
    </property>
    <!-- results in a setSomeSet(java.util.Set) call -->
    <property name="someSet">
        <set>
            <value>just some string</value>
            <ref bean="myDataSource" />
        </set>
    </property>
</bean>

特别的,上述四种类型还可以通过bean动态增加或者修改里面的内容,使用merge="true"开始更新模式:

<beans>
    <bean id="parent" abstract="true" class="example.ComplexObject">
        <property name="adminEmails">
            <props>
                <prop key="administrator">administrator@example.com</prop>
                <prop key="support">support@example.com</prop>
            </props>
        </property>
    </bean>
    <bean id="child" parent="parent">
        <property name="adminEmails">
            <!-- the merge is specified on the child collection definition -->
            <props merge="true">
                <prop key="sales">sales@example.com</prop>
                <prop key="support">support@example.co.uk</prop>
            </props>
        </property>
    </bean>
<beans>

2.3. Null和空字符串的注入方式

一个是设置null,一个是设置"".

Null:

<bean class="ExampleBean">
    <property name="email">
        <null/>
    </property>
</bean>

空字符串:

<bean class="ExampleBean">
    <property name="email" value=""/>
</bean>

3. 扩展方式注入

以下两种注入方式都需要先添加xml约束头。

3.1. c命名空间注入

c命名空间注入,通过有参构造器进行注入,作用相当于bean下的construct-args,可以在一个标签内完成注入而无需在标签下再创建子标签。

使用方法:

  1. 在xml头文件中添加下面的约束

    xmlns:c="http://www.springframework.org/schema/c"
    
  2. 进行依赖注入

    <!-- c-namespace declaration with argument names -->
    <bean id="beanOne" class="x.y.ThingOne" c:thingTwo-ref="beanTwo"
          c:thingThree-ref="beanThree" c:email="something@somewhere.com"/>
    

    作用和下面传统的代码相同

    <!-- traditional declaration with optional argument names -->
    <bean id="beanOne" class="x.y.ThingOne">
      <constructor-arg name="thingTwo" ref="beanTwo"/>
      <constructor-arg name="thingThree" ref="beanThree"/>
      <constructor-arg name="email" value="something@somewhere.com"/>
    </bean>
    

    c标签也支持通过下标注入有参构造器

    <!-- c-namespace index declaration -->
    <bean id="beanOne" class="x.y.ThingOne" c:_0-ref="beanTwo" c:_1-ref="beanThree"
        c:_2="something@somewhere.com"/>
    

3.2. p命名空间注入

p命名空间注入,通过setter注入属性的值,作用相当于bean下的property,可以在一个标签内完成注入而无需在标签下再创建子标签。

使用方法:

  1. 在xml头文件中添加下面的约束

    xmlns:p="http://www.springframework.org/schema/p"
    
  2. 进行依赖注入

    <bean name="p-namespace" class="com.example.ExampleBean"
          p:email="someone@somewhere.com"/>
    
    <bean name="john"
          class="com.example.Person"
          p:name="John Doe"
          p:spouse-ref="jane"/>
    

    作用和下面传统的代码相同

    <bean name="classic" class="com.example.ExampleBean">
      <property name="email" value="someone@somewhere.com"/>
    </bean>
    
    <bean name="john" class="com.example.Person">
      <property name="name" value="John Doe"/>
      <property name="spouse" ref="jane"/>
    </bean>
    
Copyright © rootwhois.cn 2021-2022 all right reserved,powered by GitbookFile Modify: 2022-05-18 16:24:00

results matching ""

    No results matching ""