首頁 > 軟體

詳解Spring Bean的集合注入和自動裝配

2022-06-11 14:03:12

一、Spring Bean 集合注入

【Spring學習筆記(三)】已經講了怎麼注入基本資料型別和參照資料型別,接下來介紹如何注入比較特殊的資料型別——集合

集合常用標籤

集合注入,用法也很簡單,只需要在 Bean 標籤下的 <property><constructor-arg>元素中新增以下集合的標籤,再通過value或者ref進行屬性注入

標籤說明
<list>用於注入 list 集合,允許重複
<set>用於注入 set集合,不允許重複
<map>用於注入 key-value 的map集合, key 和 value 可以是任意型別
<props>用於注入 key-value 的properties集合,key 和 value 必須是是字串型別

注意: List的底層也是通過陣列實現的,所以<list><array>標籤是可以混用

案例

1.建立一個Collection類和Dept類,程式碼如下

/*Collection類*/
public class Collection {
    //1.陣列
    private int[] array;
    //2.list集合
    private List<Dept> list;
    //3。set集合
    private Set<Dept> set;
    //4.map集合
    private Map<String, String> map;
    //5.properties集合
    private Properties properties;
    //列印各個集合
    public void fmt() {
        System.out.println("列印array:" + Arrays.toString(array));
        System.out.println("列印List:" + list);
        System.out.println("列印Set:" + set);
        System.out.println("列印Map:" + map);
        System.out.println("列印Properties:" + properties);
    }
    -----省略setter方法-----    
}
/*Dept類*/
public class Dept {
    //部門編號
    private int deptNo;
    //部門名稱
    private String deptName;
    @Override
    public String toString() {
        return "Dept{" +
            "deptNo=" + deptNo +
            ", deptName='" + deptName + ''' +
            '}';
    }
    -----省略setter方法----- 
}

2.編寫spring組態檔

<!--部門類屬性注入-->
<bean id="dept" class="com.bighorn.pojo.Dept">
    <property name="deptNo" value="1"/>
    <property name="deptName" value="後端組"/>
</bean>

<!--Collection類屬性注入-->
<bean id="collection" class="com.bighorn.pojo.Collection">
    <!--陣列型別-->
    <property name="array">
        <array>
            <value>114514</value>
            <value>114514</value>
            <value>114514</value>
        </array>
    </property>
    <!--List 型別-->
    <property name="list">
        <list>
            <ref bean="dept"/>
            <ref bean="dept"/>
            <ref bean="dept"/>
        </list>
    </property>
    <!--Set 型別-->
    <property name="set">
        <set>
            <ref bean="dept"/>
            <ref bean="dept"/>
            <ref bean="dept"/>
        </set>
    </property>
    <!--Map 型別-->
    <property name="map">
        <map>
            <entry key="name" value="bighorn"/>
            <entry key="age" value="18"/>
            <entry key="sex" value="man"/>
        </map>
    </property>
    <!--Properties 型別-->
    <property name="properties">
        <props>
            <prop key="username">root</prop>
            <prop key="password">123456</prop>
        </props>
    </property>
</bean>

3.編寫執行程式

public static void main(String[] args) {
    //獲取IoC容器
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    //從容器中獲取物件
    Collection collection = context.getBean("collection", Collection.class);
    //呼叫方法列印各個集合
    collection.fmt();
}

執行結果如下

二、Spring Bean自動裝配

Spring 在 Bean 與 Bean 之間建立依賴關係的行為稱為 “裝配”

Spring Bean 屬性注入 前面學習了,在 spring組態檔中通過 <constructor-arg><property> 中的 ref 屬性,手動維護 Bean 與 Bean 之間的依賴關係的,即手動裝配

手動裝配圖

什麼是自動裝配

如果容器中Bean很多,依賴關係又非常複雜,此時手動裝配就略顯吃力且繁瑣了,所以Spring 框架為我們提供了 “自動裝配” 功能,提高開發效率。

Spring 自動裝配:Spring IoC容器根據自動裝配方式,為指定的 Bean 從應用上下文(AppplicationContext 容器)自動查詢並自動注入它所依賴的 Bean。

自動裝配的方式

Spring 預設不支援自動裝配的。使用自動裝配,則需要對 Spring XML 組態檔中 <bean> 元素的 autowire 屬性進行設定,此時就不需要ref屬性了。

屬性值說明
byName按名稱自動裝配。 Bean 的 id 或 name 屬性值與這個物件屬性的名稱相同
byType按型別自動裝配。 Bean 的 class 屬性值與這個物件屬性的型別相匹配
constructor按構造器引數自動裝配。
default預設採用上一級元素 <beans> 設定的自動裝配方式(default-autowire)進行裝配。
no預設值,表示不使用自動裝配。

案例

1.建立員工類Employee和部門類Dept,新增各個成員變數的setter方法

/*員工類Employee*/
public class Employee {
    //員工編號
    private String empNo;
    //員工姓名
    private String empName;
    //部門資訊
    private Dept dept;
    //各個屬性的setter方法
    public void setEmpNo(int empNo) {
        this.empNo = empNo;
    }
    public void setEmpName(String empName) {
        this.empName = empName;
    }
    public void setDept(Dept dept) {
        this.dept = dept;
    }
    ----省略toString方法------  
}

/*部門類Dept*/
public class Dept {
    //部門編號
    private String deptNo;
    //部門名稱
    private String deptName;
    //各個屬性的setter方法
    public void setDeptNo(int deptNo) {
        this.deptNo = deptNo;
    }
    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }
    ----省略toString方法------
}

2.編寫spring組態檔

<!--部門類屬性注入-->
<bean id="dept" class="com.bighorn.pojo.Dept">
    <property name="deptNo" value="2"/>
    <property name="deptName" value="前端組"/>
</bean>
<!--員工類屬性注入-->
<bean id="employee" class="com.bighorn.pojo.Employee" autowire="byType">
    <property name="empNo" value="114514"/>
    <property name="empName" value="lzh"/>
</bean>

3.編寫執行程式

public static void main(String[] args) {
    //獲取IoC容器
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    //從容器中獲取物件
    Employee employee = context.getBean("employee", Employee.class);
    System.out.println(employee);
}

結果如下圖

注意點

  • 自動裝配用於參照型別依賴注入,不能對簡單型別進行操作
  • 使用按型別裝配時(byType)必須保障容器中相同型別的bean唯一,推薦使用
  • 使用按名稱裝配時(byName)必須保障容器中具有指定名稱的bean,因變數名與設定耦合,不推薦使用
  • 自動裝配優先順序低於setter注入與構造器注入,同時出現時自動裝配設定失效

以上就是詳解Spring Bean的集合注入和自動裝配的詳細內容,更多關於Spring Bean集合注入 自動裝配的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com