三、spring之DI注入2(注入引用类型)

三、spring之DI注入2(注入引用类型)

一、3种DI注入方式


  1. 构造方式通过constructor-arg标签及其属性
    1)name:代表构造方法字段名
    2)ref:注入spring容器中对应id类的实

2.SET方式 注意:该实体类必须有对应构造方法

**通过property标签及其属性**
 **1)name**:代表构造方法字段名
 **2)ref:**注入spring容器中对应id类的实

3、接口注入(工厂方法注入)(基本不用)


4.自动注入autowire


通过bean的autowire属性及其对应值
1)、no不使用自动装配,需要程序员手动配置注入 这里说下id和name的区别,其实没啥区别,主要就是name可以使用特殊字符,而id不能,而日常使用中,也没谁会在name中设置,所以说两者没区别。
2)、byName 通过容器中的id,调用set方法,所以该类必须有对应set方法通过的bean的type来匹配进行注入,也就是bean的id。如:bean A有个属性master类型为org.springframework.beans.Conversion.class,master的setter方法就是setMaster,A设置了autowire=”byType”,那么Spring就会在容器中查找class类型为Conversion的bean通过setMaster方法注入到A中。如果有多个相同的class类型,则匹配报错
3)、byType 通过容器中的类型,调用set方法,所以该类必须有对应set方法
4)、constructor 通过构造方式,调用有参构造,所有该类必须有有参构造。与byType一样,如果存在多个bean类型为B或者C,则会抛出异常。但时与byType不同的是,如果在容器中找不到匹配的类的bean,将抛出异常,因为Spring无法调用构造函数实例化这个bean。
5)、default默认,即byType方式

<?xml version="1.0" encoding="UTF-8"?>
   <!-- 导入约束 :xsd -->
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd"

        >

    <!-- 配置service交给spring管理 autowire自动注入方式-->
    <bean id="userService" class="cn.it.demo.service.impl.UserServiceImpl" autowire="constructor" >
    </bean>

    <!-- 配置dao交给spring管理 set方式-->
    <bean id="userDao" class="cn.it.demo.dao.impl.UserDaoImpl">
        <property name="runner" ref="run"></property>
    </bean>
        <!-- 配置第三方类库QueryRunner交给spring管理 构造方式-->
    <bean id="run" class="org.apache.commons.dbutils.QueryRunner">
        <constructor-arg name="ds"  ref="ds"></constructor-arg>
    </bean>
    <!-- 配置第三方类库DataSource交给spring管理 -->
    <bean id="ds" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!-- 基本元素赋值 -->
        <property name="user" value="root"></property>
        <property name="password" value="root"></property>
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql:///mybatisdb"></property>
    </bean>

</beans>

说明:IOC加载顺序(在存在DI注入时)
是按配置文件的先后顺序进行加载类和创建相应对象的(默认是单利模式),当遇到DI注入时,
·1.如果是GET方式注入,或者autowire的get形式即byTape,byName和默认,会先创建该对象,当注入类创建好后再进行set方式注入,创建需要创建的对象放入spring容器管理
2.如果是构造方式,或者autowire的构造形式,则需要等需要注入的对象加载并创建对象完成,再调用对应有参构造完成注入创建需要创建的对象放入spring容器管理
3.顺序总结如果有需要注入的对象未被创建,(set方式注入,会有限创建本对象,构造方式会需要直接扫描获得依赖对象再创建本对象),再去扫描spring会扫描文档将注入依赖链需要创建的对象依次创建出来,然后再继续顺序执行加载并创建其他对象放入容器管理

<?xml version="1.0" encoding="UTF-8"?>
<!-- 导入约束 :xsd -->
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 对于初学者,我们可以采用最简单的方式,在不看源码的情况下,初步了解spring底层的执行流程或者方式 -->    

    <!-- 放入第1个干扰对象 -->
    <bean id="user1" class="cn.it.demo.domain.User">
    </bean>

    <!-- web层,他需要通过set方法注入userService -->
    <bean id="servlet" class="cn.it.demo.web.servlet">
        <property name="userService" ref="userService"></property>
    </bean>
    <!-- 放入第2个干扰对象 -->
    <bean id="user2" class="cn.it.demo.domain.User">
    </bean>

     <!-- 业务层,他需要通过构造方式注入userDao -->
    <bean id="userService" class="cn.it.demo.service.impl.UserServiceImpl">
        <constructor-arg name="userDao" ref="userDao"></constructor-arg>
    </bean>
    <!-- 放入第3个干扰对象 -->
    <bean id="user3" class="cn.it.demo.domain.User">
    </bean>
    <!-- web层,他需要通过set方法注入userService -->
    <bean id="userDao" class="cn.it.demo.dao.impl.UserDaoImpl">
    </bean>

</beans>
执行顺序:
user
无参构造创建了servlet
无参构造创建了dao
有参构造创建了service
servlet执行了setService方法
user
user
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值