詳解Spring?Bean的集合注入和自動(dòng)裝配
一、Spring Bean 集合注入
在【Spring學(xué)習(xí)筆記(三)】已經(jīng)講了怎么注入基本數(shù)據(jù)類型和引用數(shù)據(jù)類型,接下來(lái)介紹如何注入比較特殊的數(shù)據(jù)類型——集合
集合常用標(biāo)簽
集合注入,用法也很簡(jiǎn)單,只需要在 Bean 標(biāo)簽下的 <property> 或<constructor-arg>元素中添加以下集合的標(biāo)簽,再通過(guò)value或者ref進(jìn)行屬性注入
| 標(biāo)簽 | 說(shuō)明 |
|---|---|
| <list> | 用于注入 list 集合,允許重復(fù) |
| <set> | 用于注入 set集合,不允許重復(fù) |
| <map> | 用于注入 key-value 的map集合, key 和 value 可以是任意類型 |
| <props> | 用于注入 key-value 的properties集合,key 和 value 必須是是字符串類型 |
注意: List的底層也是通過(guò)數(shù)組實(shí)現(xiàn)的,所以<list>和<array>標(biāo)簽是可以混用
案例
1.創(chuàng)建一個(gè)Collection類和Dept類,代碼如下
/*Collection類*/
public class Collection {
//1.數(shù)組
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;
//打印各個(gè)集合
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 {
//部門(mén)編號(hào)
private int deptNo;
//部門(mén)名稱
private String deptName;
@Override
public String toString() {
return "Dept{" +
"deptNo=" + deptNo +
", deptName='" + deptName + '\'' +
'}';
}
-----省略setter方法-----
}
2.編寫(xiě)spring配置文件
<!--部門(mén)類屬性注入-->
<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">
<!--數(shù)組類型-->
<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.編寫(xiě)運(yùn)行程序
public static void main(String[] args) {
//獲取IoC容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//從容器中獲取對(duì)象
Collection collection = context.getBean("collection", Collection.class);
//調(diào)用方法打印各個(gè)集合
collection.fmt();
}
運(yùn)行結(jié)果如下

二、Spring Bean自動(dòng)裝配
Spring 在 Bean 與 Bean 之間建立依賴關(guān)系的行為稱為 “裝配”
Spring Bean 屬性注入 前面學(xué)習(xí)了,在 spring配置文件中通過(guò) <constructor-arg>和 <property> 中的 ref 屬性,手動(dòng)維護(hù) Bean 與 Bean 之間的依賴關(guān)系的,即手動(dòng)裝配
手動(dòng)裝配圖

什么是自動(dòng)裝配
如果容器中Bean很多,依賴關(guān)系又非常復(fù)雜,此時(shí)手動(dòng)裝配就略顯吃力且繁瑣了,所以Spring 框架為我們提供了 “自動(dòng)裝配” 功能,提高開(kāi)發(fā)效率。
Spring 自動(dòng)裝配:Spring IoC容器根據(jù)自動(dòng)裝配方式,為指定的 Bean 從應(yīng)用上下文(AppplicationContext 容器)自動(dòng)查找并自動(dòng)注入它所依賴的 Bean。
自動(dòng)裝配的方式
Spring 默認(rèn)不支持自動(dòng)裝配的。使用自動(dòng)裝配,則需要對(duì) Spring XML 配置文件中 <bean> 元素的 autowire 屬性進(jìn)行設(shè)置,此時(shí)就不需要ref屬性了。
| 屬性值 | 說(shuō)明 |
|---|---|
| byName | 按名稱自動(dòng)裝配。 Bean 的 id 或 name 屬性值與這個(gè)對(duì)象屬性的名稱相同 |
| byType | 按類型自動(dòng)裝配。 Bean 的 class 屬性值與這個(gè)對(duì)象屬性的類型相匹配 |
| constructor | 按構(gòu)造器參數(shù)自動(dòng)裝配。 |
| default | 默認(rèn)采用上一級(jí)元素 <beans> 設(shè)置的自動(dòng)裝配方式(default-autowire)進(jìn)行裝配。 |
| no | 默認(rèn)值,表示不使用自動(dòng)裝配。 |
案例
1.創(chuàng)建員工類Employee和部門(mén)類Dept,添加各個(gè)成員變量的setter方法
/*員工類Employee*/
public class Employee {
//員工編號(hào)
private String empNo;
//員工姓名
private String empName;
//部門(mén)信息
private Dept dept;
//各個(gè)屬性的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方法------
}
/*部門(mén)類Dept*/
public class Dept {
//部門(mén)編號(hào)
private String deptNo;
//部門(mén)名稱
private String deptName;
//各個(gè)屬性的setter方法
public void setDeptNo(int deptNo) {
this.deptNo = deptNo;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
----省略toString方法------
}
2.編寫(xiě)spring配置文件
<!--部門(mén)類屬性注入-->
<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.編寫(xiě)運(yùn)行程序
public static void main(String[] args) {
//獲取IoC容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//從容器中獲取對(duì)象
Employee employee = context.getBean("employee", Employee.class);
System.out.println(employee);
}
結(jié)果如下圖

注意點(diǎn)
- 自動(dòng)裝配用于引用類型依賴注入,不能對(duì)簡(jiǎn)單類型進(jìn)行操作
- 使用按類型裝配時(shí)(byType)必須保障容器中相同類型的bean唯一,推薦使用
- 使用按名稱裝配時(shí)(byName)必須保障容器中具有指定名稱的bean,因變量名與配置耦合,不推薦使用
- 自動(dòng)裝配優(yōu)先級(jí)低于setter注入與構(gòu)造器注入,同時(shí)出現(xiàn)時(shí)自動(dòng)裝配配置失效
以上就是詳解Spring Bean的集合注入和自動(dòng)裝配的詳細(xì)內(nèi)容,更多關(guān)于Spring Bean集合注入 自動(dòng)裝配的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot升級(jí)到2.7.18后不兼容的地方及解決
這篇文章主要介紹了SpringBoot升級(jí)到2.7.18后不兼容的地方及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
SpringSecurity實(shí)現(xiàn)前后端分離的示例詳解
Spring Security默認(rèn)提供賬號(hào)密碼認(rèn)證方式,具體實(shí)現(xiàn)是在UsernamePasswordAuthenticationFilter 中,這篇文章主要介紹了SpringSecurity實(shí)現(xiàn)前后端分離的示例詳解,需要的朋友可以參考下2023-03-03
Mybatis中如何設(shè)置sqlSession自動(dòng)提交
在MyBatis中,默認(rèn)情況下,獲取的SqlSession對(duì)象不會(huì)自動(dòng)提交事務(wù),這意味著在進(jìn)行更新、刪除或插入等操作后,需要顯式調(diào)用commit方法來(lái)提交事務(wù),但是,可以在獲取SqlSession時(shí)通過(guò)將openSession方法的參數(shù)設(shè)置為true2024-09-09
使用Mybatis時(shí)SqlSessionFactory對(duì)象總是報(bào)空指針
本文主要介紹了使用Mybatis時(shí)SqlSessionFactory對(duì)象總是報(bào)空指針,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09
Mybatis關(guān)聯(lián)查詢結(jié)果集對(duì)象嵌套的具體使用
在查詢時(shí)經(jīng)常出現(xiàn)一對(duì)多”的關(guān)系,所有會(huì)出現(xiàn)嵌套對(duì)象的情況,本文主要介紹了Mybatis關(guān)聯(lián)查詢結(jié)果集對(duì)象嵌套的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Java與C++分別用遞歸實(shí)現(xiàn)漢諾塔詳解
漢諾塔問(wèn)題是一個(gè)經(jīng)典的問(wèn)題。漢諾塔(Hanoi Tower),又稱河內(nèi)塔,源于印度一個(gè)古老傳說(shuō)。本文將用Java與C++分別實(shí)現(xiàn),感興趣的可以學(xué)習(xí)一下2022-05-05
Java數(shù)據(jù)庫(kù)連接池技術(shù)的入門(mén)教程
這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)庫(kù)連接池技術(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Java語(yǔ)言實(shí)現(xiàn)對(duì)MySql數(shù)據(jù)庫(kù)中數(shù)據(jù)的增刪改查操作的代碼
這篇文章主要介紹了Java語(yǔ)言實(shí)現(xiàn)對(duì)MySql數(shù)據(jù)庫(kù)中數(shù)據(jù)的增刪改查操作的代碼,實(shí)現(xiàn)了連接數(shù)據(jù)庫(kù),和數(shù)據(jù)庫(kù)的增刪改查操作,有興趣的可以了解一下。2016-12-12
Apache?log4j2-RCE?漏洞復(fù)現(xiàn)及修復(fù)建議(CVE-2021-44228)
Apache?Log4j2是一款Java日志框架,大量應(yīng)用于業(yè)務(wù)系統(tǒng)開(kāi)發(fā)。2021年11月24日,阿里云安全團(tuán)隊(duì)向Apache官方報(bào)告了Apache?Log4j2遠(yuǎn)程代碼執(zhí)行漏洞(CVE-2021-44228),本文給大家介紹Apache?log4j2-RCE?漏洞復(fù)現(xiàn)(CVE-2021-44228)的相關(guān)知識(shí),感興趣的朋友一起看看吧2021-12-12

