IoC(DI 依赖注入)的两种方式

简介:

DI:Dependency Injection 依赖注入

IoC(依赖注入)的方式,也就是给Spring IoC容器中的bean赋值的方式,简称DI

DI有两种方式,接下来将详细解析

第一种方式:

Setter方式注入

最常用的注入方法,需要在xml配置文件中进行手动的配置.

要求:对象中的每个属性必须要有setter 方法

如何配置:需要为对象中的每个属性配置一个"property"标签:<property name="" />

其中name属性的值为对象中属性的名字.如何给属性注入值时,需要先确定该属性的类型

对象中的属性分为以下三种类型,不同的类型使用不同的注入方式

   1):简单数据类型(八大基本类型,String,BigDecimal,Date等).    使用value.

   2):引用数据类型(对象).    使用ref.

   3):集合数据类型.    使用集合的元素.

Setter方式注入实例

简单数据类型

引用数据类型

集合数据类型

CollectionBean.java

package com.xiongluoluo.bean;

import lombok.*;

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

/**
 * Created by Administrator on 2020/1/1 0001.
 */
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class CollectionBean {
    /*集合数据类型*/
    private Set<String> set;
    private List<String> list;
    private String[] array;
    private Map<String, String> map;
    private Properties prop;
}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--private Set<String> set;
    private List<String> list;
    private String[] array;
    private Map<String, String> map;
    private Properties prop;-->

       <!--Setter注入:为集合数据类型注入值的方式-->
       <bean id="collectionBean" class="com.xiongluoluo.bean.CollectionBean">
           <!--Setter注入:Set集合注入值的方式-->
            <property name="set">
                <set>
                    <value>set1</value>
                    <value>set2</value>
                    <value>set3</value>
                </set>
            </property>

           <!--Setter注入:List集合注入值的方式-->
           <property name="list">
               <list>
                   <value>list1</value>
                   <value>list2</value>
                   <value>list3</value>
               </list>
           </property>

           <!--Setter注入:为数组的注入值的方式-->
           <property name="array">
               <array>
                   <value>array1</value>
                   <value>array2</value>
                   <value>array3</value>
               </array>
           </property>

           <!--Setter注入:Map集合注入值的方式-->
           <!--由于Map集合是双列集合,所以注入值的方式跟别的不太一样,
           认真记忆一下即可-->
           <property name="map">
               <map>
                   <entry key="key1">
                       <value>value1</value>
                   </entry>
                   <entry key="key2">
                       <value>value2</value>
                   </entry>
                   <entry key="key3">
                       <value>value3</value>
                   </entry>
               </map>
           </property>


           <!--Properties集合注入值的方式-->
           <!--Properties也是一个双列集合,Map的类似,但又不太一样
           认真观察-->
           <property name="prop">
               <props>
                   <prop key="prop1">prop1</prop>
                   <prop key="prop2">prop2</prop>
                   <prop key="prop3">prop4</prop>
               </props>
           </property>

       </bean>


</beans>

SpringTest.java

package com.xiongluoluo.test;

import com.xiongluoluo.bean.CollectionBean;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * Created by Administrator on 2020/1/1 0001.
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:*.xml")
public class SpringTest {
    @Autowired
    private CollectionBean collectionBean;

    @Test
    public void test(){
        System.out.println(collectionBean);
    }
}

测试结果

 

第二种注入方式

构造器注入

构造器注入:利用构造函数为对象中的属性注入值,需要在xml配置文件中进行手动的配置.

要求:对象中必须存在有参数的构造函数.xml中手动配置了哪些属性需要注入值,对象中必须存在对应的属性为参数的构造函数.

如何配置:需要为对象中的每个属性配置一个"constructor-arg"标签:<constructor-arg name="" />

多个参数时,可以用name,value,也可以用index

方式一:

<bean id="dog" class="com.xiongluoluo.bean.Dog">
    <constructor-arg name="age" value="3"/>
    <constructor-arg name="name" value="小狗"/>
</bean>

方式二:

<bean id="dog1" class="com.xiongluoluo.bean.Dog">
    <constructor-arg index="0" value="3"/>
    <constructor-arg index="1" value="小狗"/>
</bean>

总结

本文主要介绍了Spring容器依赖注入的两种方式,Setter方式注入,以及构造器方式注入.Setter方式注入更常用一些.构造器注入其实跟Setter注入本质差不多.但是特别坑的是,必须要有那个构造函数,有几个参数必须写几个属性.但是Setter方式注入就自由很多.所以Setter方式更常用.

发布了100 篇原创文章 · 获赞 7 · 访问量 7558

猜你喜欢

转载自blog.csdn.net/qq_40245464/article/details/103793585