Spring实现依赖注入的几种方式

spring官网:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-collection-elements

原理:在标准的applicationContext.xml文件中配置<bean>标签,实现创建类对象操作

1.通过构造器注入

1.1无参构造

    <!--如果配置的bean对象有无参构造,并且是一个简单属性类型,就可以直接通过这种方式注入-->
    <bean id="userInfo" class="com.school.pojo.Users">
        <property name="sex" value="男性"/>
    </bean>



    <!--当类中属性有另一个Bean类型时:要通过ref-->
    <!--这两个实体类中没有属性,所以可以不要定义property-->
    <bean id="userImpl1" class="com.school.dao.UserInfoImpl"/>
    <bean id="userImpl2" class="com.school.dao.UserInfoImpl2"/>

    <bean id="userService" class="com.school.service.UserServiceImpl">
        <!--
        ref: 装载复杂类型的数据,指定要实例化的类型,即引用Spring容器中已经创建好的对象
        value: 简单的类型,就是要实例化属性具体的值
        -->
        <!--将userImpl1-->
        <property name="ui" ref="userImpl2"/>
    </bean>

1.2有参构造

    <!--三种方式实现有参数构造注入-->
    <!--为bean标签设置别名,只要添加一个name即可,在从Bean容器获取的时候用的就是id值-->
    <bean id="bookInfo" class="com.school.pojo.Books" name="bookAll">
        <!--方式1,构造函数参数类型匹配,不推荐,当一个类中存在相同属性时,要根据类中定义的顺序设置constructor-arg-->
        <!--<constructor-arg type="int" value="1998"/>-->
        <!--方式2,构造函数参数索引-->
        <!--<constructor-arg index="0" value="1999"/>-->
        <!--方式3,构造函数参数名称,推荐使用-->
        <constructor-arg name="price" value="1990"/>
    </bean>

2.通过set注入

2.1通过一个实体类声明不同类型的变量名(bean | ref | idref | list | set | map | props | value | null)

    <bean id="book1" class="com.school.pojo.Books">
        <!--有参构造的注入-->
        <constructor-arg name="price" value="12"/>
    </bean>

    <!--将student中的所有属性注入-->
    <bean id="student" class="com.school.pojo.Student">
        <!--对应实体类private String name;-->
        <property name="name" value="小金"/>

        <!--对应实体类private Books book;-->
        <property name="book" ref="book1"/>

        <!--对应实体类private String[] id;-->
        <property name="id">
            <array>
                <value>小红</value>
                <value>小黄</value>
                <value>小橙</value>
            </array>
        </property>

        <!--对应实体类private Map<String,String> packages;-->
        <property name="packages">
            <map>
                <entry key="键1" value="红"/>
                <entry key="键2" value="橙"/>
                <entry key="键3" value="黄"/>
            </map>
        </property>

        <!--对应实体类private Set<String> stringSet;-->
        <property name="stringSet">
            <set>
                <value>set1</value>
                <value>set2</value>
                <value>set3</value>
            </set>
        </property>
        
        <!--对应实体类private Properties properties;-->
        <property name="properties">
            <props>
                <prop key="driver">com.jdbc.mysql.Driver</prop>
                <prop key="username">root</prop>
                <prop key="password">root</prop>
            </props>
        </property>
    </bean>

3.通过其它方式注入

3.1带有p命名空间的注入(根据set属性)

  
    <!--未设置P命名空间注入时xml配置文件-->
    <bean id="classroom" class="com.school.pojo.Classroom">
        <property name="name" value="1号教室"/>
        <property name="id" value="101"/>
    </bean>



    <!--使用P命名空间注入时德xml配置文件,所谓P命空间就是property的缩写。先要在beans标签中加入xmlns:p="http://www.springframework.org/schema/p"-->
    <!--使用P时要有无参构造函数,不然会报错-->
    <bean id="classroom2" class="com.school.pojo.Classroom" p:id="102" p:name="2号教室"/>
    

3.2带有c命名空间的注入(根据构造函数)

    <bean id="classroom" class="com.school.pojo.Classroom">
        <property name="name" value="1号教室"/>
        <property name="id" value="101"/>
    </bean>


    <!--使用C命名空间方式注入,C就是 constructor 的首字母缩写。先要在beans标签中加入xmlns:c="http://www.springframework.org/schema/c"-->
    <!--使用C时要有全参构造函数,不然会报错-->
    <!--例子:<bean id="beanOne" class="x.y.ThingOne" c:thingTwo-ref="beanTwo"
        c:thingThree-ref="beanThree" c:email="something@somewhere.com"/>-->
    <bean id="classroom3" class="com.school.pojo.Classroom" c:name="33号教室" c:id="133"/>

总结:这是一个基本的实现原理,也是今天学习的一些知识,写的时DI依赖注入的三种实现方式,还有一些东西没有细分,更详细的官方文档在一开始处指出,可以去那里查看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值