詳解Spring Bean的集合註入和自動裝配
一、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集合註入 自動裝配的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Spring Bean屬性註入的兩種方式詳解
- Spring框架的JdbcTemplate使用
- 一文搞懂Spring Bean中的作用域和生命周期
- spring IOC容器的Bean管理XML自動裝配過程
- Spring-IOC容器-Bean管理-基於XML方式超詳解