4.注入

1.什么是注入
通过spring工厂及配置文件,为锁创建对象成员变量进行赋值
1.1为什么需要

通过硬编码的方法对成员变量进行复制,存在耦合

springboot set注入如何实现 spring set注入原理_java

1.2 如何进行注入
  • 为成员变量提供get set方法
  • 配置spring的配置文件
<bean id="person" class="com.xxc.basic.Person">
    <property name="id">
        <value>11</value>
    </property>
    <property name="name">
        <value>xiaoxiao</value>
    </property>
</bean>
1.3 好处

解耦合

2.spring注入的原理分析(简易)

spring底层通过调用对象属性的set方法,完成成员变量的赋值,这种方式也被称之为set注入

springboot set注入如何实现 spring set注入原理_spring_02

5.set注入详解

针对不同类型的成员变量在<property>标签中,需要嵌套其他标签

springboot set注入如何实现 spring set注入原理_后端_03

1. JDK内置类型
1.1 String + 8中基本数据类型
<value>xxx</value>
1.2 数组
<property name="emails">
            <list>
                <value>liucy@163.com</value>
                <value>jack@163.com</value>
                <value>john@163.com</value>
            </list>
        </property>
1.3 set集合
<property name="tesl">
    <set>
        <value>15611111111</value>
        <value>13811111111</value>
        <value>13811111111</value>
        <value>13811111111</value>
        <value>19811111111</value>
    </set>
</property>

当被赋值的对象没有加泛型时,代表可以存任何对象,即
<set>
	<ref bean
    <set
</set>
1.4 List集合
<property name="addresses">
    <list>
        <value>xiaoxiao</value>
        <value>chongchong</value>
        <value>xiaohua</value>
    </list>
</property>
1.5 Map集合
注意:map中嵌套entry,entry中的键有特殊的标签<key></key>,值则需要根据对应类型进行选择
<property name="qqs">
    <map>
        <entry>
            <key><value>xxc</value></key>
            <value>11111111</value>
        </entry>
        <entry>
            <key><value>sun</value></key>
            <value>22222222</value>
        </entry>
    </map>
</property>
1.6 properites类型
properties类型是一种特殊的map	key---String;value---String
<property name="p">
    <props>
        <prop key="key1">value1</prop>
        <prop key="key2">value2</prop>
        <prop key="key3">value3</prop>
    </props>
</property>
1.7 复杂的数据类型
如Data..等
需要自定义类型转换器,就能进行处理
2. 用户自定义类型
2.1 第一种方式
1. 为成员变量提供set get方法
2. 使用配置文件进行注入

<bean id="userService" class="xxx.UserServiceImpl">
	<property name="userDAO">
<!--            该对象只是用一次,并且不会被别人引用时,就可以直接使用class,而不使用id属性        -->
		<bean class="xxx.UserDAOImpl"/>
	</property>
</bean>
2.2 第二种方式
第一种方式存在的问题:
1. 配置文件代码冗余
2. 被注入的对象,若多次创建,浪费(JVM)资源
1. 为成员变量提供set get方法
2. 使用配置文件进行注入

<bean id="userDAO" class="xxx.UserDAOIpmpl"/>

<bean id="userService" class="xxx.UserServiceImpl">
	<ref bean="userDAO"/>
</bean>

在spring4.x 废除了 <ref local=""/> 基本等效与 <ref bean=""/>
区别:local只能引用本配置文件中的bean,但是,bean可以引用父容器的(springMVC)
3.set注入简化写法
3.1 基于属性简化
JDK注入
<property name="name">
	<value>xxc</value>
</property>
	
<property name="name" value="xxc"/>

注意:value只能简化基本数据类型+String

<bean id="userDAO" class="xxx.UserDAOIpmpl"/>
<bean id="userService" class="xxx.UserServiceImpl" ref="userDAO"/>
3.2 基于p命名空间简化
JDK类型注入
<bean id="person" class="com.xxc.basic.Person">
    <property name="name">
        <value>xxc</value>
    </property>
</bean>
<!--变为:-->
<bean id="person" class="com.xxc.basic.Person" p:name="xxc" p:id="123456"/>


注意:value只能简化基本数据类型+String
<bean id="userDAO" class="xxx.UserDAOIpmpl"/>
<bean id="userService1" class="com.xxc.basic.UserServiceImpl">
            <property name="userDAO">
                <ref bean="userDAO"/>
            </property>
</bean>
<!--变为:-->
<bean id="userService2" class="com.xxc.basic.UserServiceImpl" p:userDAO-ref="userDAO"/>

6.构造注入

1. 注入: 通过spring配置文件为成员变量赋值
2. set注入: spring调用set方法,通过配置文件对成员变量进行赋值
3. 构造注入: spring调用构造方法,通过配置文件对成员变量进行赋值
1.开发步骤
1. 提供有参构造
public class Customer implements Serializable {
    private String name;
    private int age;

    public Customer(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

2. spring配置文件进行配置
	注意:构造方法有多少参数就有多少<constructor-arg>,并且顺序与构造方法书序一致
    <bean id="customer" class="com.xxc.basic.constructer.Customer">
        <constructor-arg>
            <value>xxc</value>
        </constructor-arg>
        <constructor-arg>
            <value>21</value>
        </constructor-arg>
    </bean>
2.构造方法重载
2.1 参数个数不同
控制<constructor-arg>标签个数来进行区分
2.2 参数个数相同
通过在标签中引入type属性进行区分 <constructor-arg type="">
3.注入总结
未来实战中,应用set注入还是构造注入?
set注入会更多
	1. 构造注入麻烦(重载)
	2. spring框架底层,大量使用了set注入

springboot set注入如何实现 spring set注入原理_java_04