day120 - 依赖注入的几种方式

发布时间 2023-07-25 19:55:50作者: 北海之上

setter依赖注入

配置bean时为属性赋值

<bean id="studentTwo" class="com.gu.spring.pojo.Student">
    <!--
        property:根据成员变量的set方法进行赋值,set注入
        name:设置需要赋值的属性名
        value:设置指定属性值
    -->
    <property name="sid" value="1001"></property>
    <property name="sname" value="张三"></property>
    <property name="age" value="23"></property>
    <property name="gender" value="男"></property></bean>

 

test

@Test
    public void testDI(){
        //获取ioc容器
        ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");
        //获取bean
        Student studentTwo = ioc.getBean("studentSix", Student.class);
        System.out.println(studentTwo);
//        Object clazzInner = ioc.getBean("clazzInner", Clazz.class);
//        System.out.println(clazzInner);
//        Clazz clazzOne = ioc.getBean("clazzOne", Clazz.class);
//        System.out.println(clazzOne);
​
    }

 

构造器依赖注入

当实体类中添加的有有参构造时

可以在bean中使用<constructor-arg来进行配置

<bean id="studentThree" class="com.gu.spring.pojo.Student">
    <constructor-arg value="1002"></constructor-arg>
    <constructor-arg value="李四"></constructor-arg>
    <constructor-arg value="24"></constructor-arg>
    <constructor-arg value="女"></constructor-arg>
</bean>

 

注意:constructor-arg标签还有两个属性可以进一步描述构造器参数:

index属性:指定参数所在位置的索引(从0开始)

name属性:指定参数名

test

同上

依赖注入中的特殊值处理

null值

<property name="name"> <null /> </property>

 

注意:

value="null"代表值为字符串null

    
<bean class="com.gu.spring.pojo.Student" id="studentFour">
        
<!--
        特殊值:
            <: &lt;
            >: &gt;
            [CDATA[]]中的所有内容会被原样解析
            CDATA是xml中一个特殊的标签,因此不能写在属性中,只能作为标签使用
-->
        <property name="sid" value="1003"></property>
        <property name="sname" value="lisi"></property>
        <property name="gender">
            <value><![CDATA[
                a>b
            ]]></value>
        </property>
        <property name="age" value="24"></property>
    </bean>

 

为类属性进行赋值

引用外部的已经声明的bean

<bean id="clazzOne" class="com.gu.spring.pojo.Clazz">
    <property name="cid" value="1111"></property>
    <property name="cname" value="最强王者班"></property>
    <property name="students" ref="studentList"></property>
</bean>

 

为类属性赋值已经声明的bean,注意使用ref标签

<bean id="studentFive" class="com.gu.spring.pojo.Student">
    <property name="sid" value="1003"></property>
    <property name="sname" value="lisi"></property>
    <property name="age" value="23"></property>
    <property name="gender" value="男"></property>
    <!--
            引用ioc容器中某个bean的id
    -->
    <property name="clazz" ref="clazzOne"></property>
   </bean> 

 

若将ref使用value:IllegalStateException:Cannot convert value of type 'java.lang.String' to required type

意思是不能把String类型转换成我们要的Clazz类型,说明我们使用value属性时,Spring只把这个属性看做一个普通的字符串,不会认为这是一个bean的id,更不会根据它去找到bean来赋值

内部bean

<bean id="studentFive" class="com.gu.spring.pojo.Student">
    <property name="sid" value="1003"></property>
    <property name="sname" value="lisi"></property>
    <property name="age" value="23"></property>
    <property name="gender" value="男"></property>
    <property name="clazz">
    <!--
                内部bean,只能在当前的bean内部使用,不能直接通过ioc容器获取
    -->
        <bean id="clazzInner" class="com.gu.spring.pojo.Clazz">
            <property name="cid" value="1111"></property>
            <property name="cname" value="最强王者班"></property>
        </bean>
    </property>
     </bean>

 

内部bean只能用于给属性赋值,不能在外部通过IOC容器获取,因此可以省略id属性

级联方式

<bean id="studentFive" class="com.gu.spring.pojo.Student">
    <property name="sid" value="1003"></property>
    <property name="sname" value="lisi"></property>
    <property name="age" value="23"></property>
    <property name="gender" value="男"></property>
    
    <!--
            级联:
            要保证提前对clazz属性赋值或者实例化
    -->
    <property name="clazz" ref="clazzOne"></property>
    <property name="clazz.cid" value="2222"></property>
    <property name="clazz.cname" value="倔强青铜班"></property>

 

over