Spring DI注入技术

Posted TracyDemo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring DI注入技术相关的知识,希望对你有一定的参考价值。

1概念:Dependence injection 依赖注入技术

   DI技术解决组件装配问题,不是对象创建问题,对象默认采用无参构造函数

   容器与bean对象建立关系,实现注入途径DI注入

   DI注入会自动将调用者需要的对象实例注入给调用者,调用者通过 Spring 容器获得被调用者实例,这称为依赖注入

2.两种注入方式

a..Spring的setter注入

在实体类中构造setter方法,基本类型value注入,对象类型ref注入,属性与成员变量不是同一个概念,此属性对应setter方法成员变量

b.构造器注入

<constructor-arg index="" value=""></constructor-arg>,默认通过有参构造,进行参数注入,在实体类中必须构造有参函数

根据参数个数,参数类型就行注入,有局限性

c.自动装配(自动注入)

可以简化Xml配置,使用autowire取值

no-不采用自动装配

byName-根据bean的属性值或者id属性值进行注入

byType-根据类型进行注入,不识别id,会发生冲突

constructor-应用于构造器参数

Card类

public class Card {

    private String suit;
    private int point;

CardPlayer类

public class CardPlayer {
    private String name;
    private int age;
public class MsgBean {
    private String name;
    private int length;
    private List<String> friends;
    private Set<String>  familys;
    private Map<String,String> phones;
    private Properties address;//属性集合属性
    

 

private Card card;
    
      private CardPlayer()
      { super(); // TODO Auto-generated constructor stub
      }
      
     

    private CardPlayer(String name, int age, Card card) {
        super();
        this.name = name;
        this.age = age;
        this.card = card;
    }

Xml里面bean组件配置

<bean id="card" class="com.tracy.bean.Card">
<property name="suit" value="红桃"></property>
<property name="point" value="13"></property>
</bean>
<!-- ref 直接引用id=“card” -->
<bean id="player" class="com.tracy.bean.CardPlayer">
<property name="name" value="赌王"></property>
<property name="age" value="19"></property>
<property name="card" ref="card"></property>
</bean>
<!-- 构造器注入 默认调用有参构造 -->
<bean id="player2" class="com.tracy.bean.CardPlayer">
<constructor-arg index="0" value="啊哈哈"></constructor-arg>
<constructor-arg index="1" value="200"></constructor-arg>
<constructor-arg index="2" ref="card"></constructor-arg>
</bean>

 

 自动装载数据类型

<!-- setter注入 --> 
<bean id="card" class="com.tracy.bean.Card">
    <property name="suit" value="红桃"></property>
    <property name="point" value="13"></property>
</bean>

<!-- ref 直接引用id=“card” -->
<bean id="player" class="com.tracy.bean.CardPlayer">
    <property name="name" value="赌王"></property>
    <property name="age" value="19"></property>
    <property name="card" ref="card"></property>
</bean>
  <!-- 构造器注入 默认调用有参构造 autowire="no" 自动化装配未开启  byName按名字装配-->
  <bean id="player2" class="com.tracy.bean.CardPlayer" autowire="constructor">
     <constructor-arg index="0" value="王八"></constructor-arg>
     <constructor-arg index="1" value="100"></constructor-arg>
</bean>

3.Bean参数注入

基本数据类型的注入:short int byte long float double String boolean

<!--基本数据类型进行注入-->
<bean id="player" class="com.tracy.bean.CardPlayer">
    <property name="name">
                <value>赌王</value>
     </property>
    <property name="age" >
            <value>18</value>
    </property>
    <property name="card" >
               <null></null>
   </property>
</bean>

4.集合注入

List Map Set Property

List注入允许重复  Set注入set不允许重复,可以排重

XML文件配置

<bean id="msg2" class="com.tracy.bean.MsgBean">
<property name="name" value="你的好友列表"></property>
<property name="length" value="4"></property>
<!--list集合注入 -->
<property name="friends">
<list>
<value>小明</value>
<value>小王</value>
<value>小张</value>
<value>小小</value>
<value>小小</value>

</list>
</property>
<!--set集合注入 -->
<property name="familys">
<set>
<value>小明</value>
<value>小王</value>
<value>小张</value>
<value>小小</value>
<value>小小</value>

</set>
</property>
<!-- Map集合注入 -->
<property name="phones">
<map>
<entry key="小赵" value="1772512999"></entry>
<entry key="小钱" value="1777777800"></entry>
<entry key="小孙" value="1777777800"></entry>
<entry key="小李" value="1777777800"></entry>

</map>
</property>
<property name="address">
<props>
<prop key="小周">兰州</prop>
<prop key="小吴">北京</prop>
<prop key="小郑">重庆</prop>
<prop key="小王">云南</prop>
</props>
</property>
</bean>

实体类

public class MsgBean {
    private String name;
    private int length;
    private List<String> friends;
    private Set<String>  familys;
    private Map<String,String> phones;
    private Properties address;//属性集合属性
    

5.单独自定义集合类

<!-- setter注入 --> 

<bean id="msg" class="com.tracy.bean.MsgBean">
    <property name="name" value="你的好友列表"></property>
    <property name="length" value="4"></property>
    <property name="friends"  ref="myFriends"></property>
    <property name="address" ref="myDress">    </property>
</bean>

<!--自定义集合类型  -->
<util:list id="myFriends">
            <value>小明</value>
            <value>小王</value>
            <value>小张</value>
            <value>小小</value>
</util:list>
<util:properties id="myDress">
           <prop key="小周">兰州</prop>
            <prop key="小吴">北京</prop>
            <prop key="小郑">重庆</prop>
            
</util:properties>

 6.什么时候调用无参构造,什么时候调用有参构造

a。xml配置文件

<!-- setter注入 --> 
<bean id="card" class="com.tracy.bean.Card">
    <property name="suit" value="红桃"></property>
    <property name="point" value="13"></property>
</bean>
<!-- setter注入 --> 
<bean id="card2" class="com.tracy.bean.Card">
    <property name="suit" value="红桃"></property>
    <property name="point" value="13"></property>
</bean>
<!-- ref 直接引用id=“card” -->
<bean id="player" class="com.tracy.bean.CardPlayer">
    <property name="name" value="赌王"></property>
    <property name="age" value="19"></property>
    <property name="card" ref="card"></property>
</bean>
  <!-- 构造器注入 默认调用有参构造 autowire="no" 自动化装配未开启  byName按名字装配-->
  <bean id="player2" class="com.tracy.bean.CardPlayer" autowire="byName">
     <constructor-arg index="0" value="王八"></constructor-arg>
     <constructor-arg index="1" value="100"></constructor-arg>
</bean>

b。测试方法

@Test
    public void beanDIAuto() {
    ApplicationContext appContext=new ClassPathXmlApplicationContext("com/tracy/xml/bean-DI-Auto.xml");
             CardPlayer player2=appContext.getBean("player2",CardPlayer.class);
        System.out.print("自动装载"+player2);
            
    }

c。测试结果

 

 d。总结,autowire=byName 按照名字自动装载,Spring容器默认scope为singleton,单例模式,容器启动时创建对象,默认通过无参函数构造对象,通过setter方法在进行注入,注意是进行调用方法进行注入,不是直接赋值。

     card无参构造调用两次,创建对象,cardPlayer调用了一次无参构造,setter构造调用setter方法,一次有参构造,构造器注入,默认调用有参构造,通过有参函数注入

注意:有参构造函数注入参数,对象的创建与注入是一起,不在单独调用无参函数进行对象创建

以上是关于Spring DI注入技术的主要内容,如果未能解决你的问题,请参考以下文章

Spring一文带你吃透基于XML的DI技术

DI三种注入方式

Spring DI(依赖注入)

spring的ioc技术

Spring的AOP面向切面原理,IOC控制反转也叫DI依赖注入原理

spring核心思想:IOC(控制反转)和DI(依赖注入)