spring学习 注⼊(Injection)

1、什么是注⼊

通过Spring⼯⼚及配置⽂件,为所创建对象的成员变量赋值

1.1 为什么需要注⼊

通过编码的⽅式,为成员变量进⾏赋值,存在耦合

在这里插入图片描述

1.2 如何进⾏注⼊[开发步骤]

类的成员变量提供set get⽅法

配置spring的配置⽂件

<bean id="person" class="com.baizhiedu.basic.Person">
 <property name="id">
 <value>10</value>
 </property>
 <property name="name">
 <value>xiaojr</value>
 </property>
</bean>

1.3 注⼊好处

解耦合

2、Spring注⼊的原理分析(简易版)

Spring通过底层调⽤对象属性对应的set⽅法,完成成员变量的赋值,这种⽅式我们也称之为set注⼊

在这里插入图片描述

3、Set注⼊详解

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

在这里插入图片描述

1. JDK内置类型

1.1 String+8种基本类型

<value>suns</value>

1.2 数组

<list>
 <value>[email protected]</value>
 <value>[email protected]</value>
 <value>[email protected]</value>
</list>

1.3 Set集合

<set>
 <value>11111</value>
 <value>112222</value>
</set>

1.4 List集合

<list>
 <value>11111</value>
 <value>2222</value>
</list>

1.5 Map集合

注意: map -- entry -- key有特定的
标签 <key></key>值根据对应类型选择对应类型的标签
<map>
 <entry>
 <key><value>suns</value></key>
 <value>3434334343</value>
 </entry>
</map>

1.6 Properites

Properties类型 特殊的Map key=String value=String

<props>
 <prop key="key1">value1</prop>
 <prop key="key2">value2</prop>
</props>

1.7 复杂的JDK类型 (Date)

需要程序员⾃定义类型转换器,处理。

2. ⽤户⾃定义类型

2.1 第⼀种⽅式

为成员变量提供set get⽅法
配置⽂件中进⾏注⼊(赋值)

<bean id="userService"  class="xxxx.UserServiceImpl">
 <property name="userDAO">
 <bean  class="xxx.UserDAOImpl"/>
 </property>
</bean>

2.2 第⼆种⽅式

第⼀种赋值⽅式存在的问题

  1. 配置⽂件代码冗余
  2. 被注⼊的对象(UserDAO),多次创建,浪费(JVM)内存资源

为成员变量提供set get⽅法
配置⽂件中进⾏配置

<bean id="userDAO"  class="xxx.UserDAOImpl"/>
<bean id="userService"  class="xxx.UserServiceImpl">
  <property name="userDAO">
    <ref bean="userDAO"/>
  </property>
 </bean>
 
#Spring4.x 废除了 <ref local=""/>
基本等效 <ref bean=""/>

3. Set注⼊的简化写法

3.1 基于属性简化

JDK类型注⼊
<property name="name">
 <value>suns</value>
</property>

<property name="name"  value="suns"/>
注意:value属性 只能简化 8种基本类型+String 注⼊标签


⽤户⾃定义类型
<property name="userDAO">
   <ref bean="userDAO"/>
</property>

<property name="userDAO" ref="userDAO"/>

3.2 基于p命名空间简化

JDK类型注⼊
<bean id="person" class="xxxx.Person">
    <property name="name">
       <value>suns</value>
   </property>
</bean>


<bean id="person" class="xxx.Person"  p:name="suns"/>

注意:value属性 只能简化 8种基本类型+String 注⼊标签


⽤户⾃定义类型
<bean id="userService"  class="xx.UserServiceImpl">
    <property name="userDAO">
       <ref bean="userDAO"/>
    </property>
</bean>


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

4、构造注⼊

1、注⼊:通过Spring的配置⽂件,为成员变量赋值
2、Set注⼊:Spring调⽤Set⽅法 通过配置⽂件为成员变量赋值
3、构造注⼊:Spring调⽤构造⽅法 通过配置⽂件 为成员变量赋值

开发步骤

提供有参构造⽅法

public class Customer implements
Serializable {
 private String name;
 private int age;
 public Customer(String name, int age) {
 this.name = name;
 this.age = age;
 }
}

Spring的配置⽂件

<bean id="customer"  class="com.baizhiedu.basic.constructer.Customer">
  <constructor-arg>
    <value>suns</value>
  </constructor-arg>
   <constructor-arg>
   <value>102</value>
 </constructor-arg>
</bean>

2. 构造⽅法重载

2.1 参数个数不同时

通过控制标签的数量进⾏区分

2.2 构造参数个数相同时

通过在标签引⼊ type属性 进⾏类型的区分

5. 注⼊的总结

未来的实战中,应⽤set注⼊还是构造注⼊?
答案:set注⼊更多

  1. 构造注⼊麻烦 (重载)
  2. Spring框架底层 ⼤量应⽤了set注⼊
    在这里插入图片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章