跳转至

pring 基于构造函数的依赖注入

1. 介绍

  当容器调用带有一组参数的类构造函数时,基于构造函数的 DI 就完成了,其中每个参数代表一个对其他类的依赖。 接下来,我们将通过示例来理解 Spring 基于构造函数的依赖注入。

<!--使用构造器的方法赋值的生活,参数的name属性是由构造方法的参数名称决定的-->
<bean id="person2" class="com.cmz.bean.Person">
    <constructor-arg name="id" value="2"></constructor-arg>
    <constructor-arg name="name" value="可可"></constructor-arg>
    <constructor-arg name="age" value="18"></constructor-arg>
    <constructor-arg name="gender" value="女"></constructor-arg>
    <constructor-arg name="date" value="2020/02/28"></constructor-arg>
</bean>

如果存在不止一个参数时,当把参数传递给构造函数时,可能会存在歧义。要解决这个问题,那么构造函数的参数在 bean 定义中的顺序就是把这些参数提供给适当的构造函数的顺序就可以了。考虑下面的类:

<!--使用构造器的方法赋值的生活,可以吧name的属性值不写,但是要注意
必须要保证数值跟构造器的参数列表的顺序一致-->
<bean id="person3" class="com.cmz.bean.Person">
    <constructor-arg value="3"></constructor-arg>
    <constructor-arg value="多多"></constructor-arg>
    <constructor-arg value="18"></constructor-arg>
    <constructor-arg value="女"></constructor-arg>
    <constructor-arg name="date" value="2020/02/28"></constructor-arg>
</bean>


<!--使用构造器的方法赋值的生活,可以吧name的属性值不写,但是要注意
必须要保证数值跟构造器的参数列表的顺序一致,若是不一致的话
,可以通过index的下标方式来标注,从0开始
-->
<bean id="person4" class="com.cmz.bean.Person">
    <constructor-arg value="3"></constructor-arg>
    <constructor-arg value="女" index="3"></constructor-arg>
    <constructor-arg value="18"></constructor-arg>
    <constructor-arg value="嘻嘻" index="1"></constructor-arg>
    <constructor-arg name="date" value="2020/02/28"></constructor-arg>
</bean>


<bean id="person5" class="com.cmz.bean.Person">
    <constructor-arg value="3"></constructor-arg>
    <constructor-arg value="18" index="2"></constructor-arg>
    <constructor-arg value="嘻嘻" index="1"></constructor-arg>
    <constructor-arg value="女" index="3"></constructor-arg>
    <constructor-arg name="date" value="2020/02/28"></constructor-arg>
</bean>

<!--当有多个相同参数的构造方法存在的时候,默认情况下是覆盖的过程,后面的构造方式会覆盖前面的构造方法
如果非要赋值给另一个构造方法的话,可以使用type的参数来执行指定
-->
<bean id="person6" class="com.cmz.bean.Person">
    <constructor-arg value="3"></constructor-arg>
    <constructor-arg value="多多"></constructor-arg>
    <constructor-arg value="18"></constructor-arg>
</bean>
如果你使用 type 属性显式的指定了构造函数参数的类型,容器也可以使用与简单类型匹配的类型。
<bean id="person7" class="com.cmz.bean.Person">
    <constructor-arg value="3"></constructor-arg>
    <constructor-arg value="多多"></constructor-arg>
    <constructor-arg value="18" type="java.lang.Integer"></constructor-arg>
</bean>
<!--总结: 在日常工作中,一般多用哪个name,value,其他很少用-->

如果你想要向一个对象传递一个引用,你需要使用 标签的 ref 属性,如果你想要直接传递值,那么你应该使用如上所示的 value 属性。

<!--给引用类型赋值 可以使用ref引用外部bean-->
<property name="address" ref="address"></property>

<!--给list赋值-->
<!--写法1-->
<!--<property name="lists" value="1,2,3"></property>-->

<!--写法2-->
<property name="lists">
    <list>
        <!--使用内部bean 无非从IOC容器中直接获取对象的值-->
        <bean class="com.cmz.bean.Address">
            <property name="province" value="江苏省"></property>
            <property name="city" value="南京市"></property>
            <property name="town" value="下关"></property>
        </bean>
        <bean class="com.cmz.bean.Address">
            <property name="province" value="河北省"></property>
            <property name="city" value="北京市"></property>
            <property name="town" value="朝阳大街"></property>
        </bean>

        <!--使用外部bean 可以随意从IOC容器获取对象的值-->
        <ref bean="address"></ref>
    </list>
</property>