Spring架構之依賴注入DI(2.0)
集合注入
1.0中我們了解了如何利用構造方法進行注入,如何利用setter方法進行注入,本次我們來了解如何進行集合注入。
對于集合的注入操作在Spring中支援以下幾種:List集合(l數組),Set集合、Map集合、Properties集合。
下面先以String為集合内容進行注入。
例1:進行List集合注入
a.定義一個list集合屬性,并聲明它的set方法;
import java.util.List;
public class Member {
private List<String> names;
public void setNames(List<String> names) {
this.names = names;
}
@Override
public String toString() {
return "Member [names=" + names + "]";
}
}
b,修改applicationContext.xml檔案
<bean id="member" class="cn.mldn.vo.Member">
<property name="names">
<list value-type="java.lang.String">
<value>SMITH</value>
<value>TONY</value>
<value>ALLLEN</value>
</list>
</property>
</bean>
c,編寫測試類;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.mldn.vo.Emp;
import cn.mldn.vo.Member;
public class TestDemoA {
public static void main(String[] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
Member member = ctx.getBean("member",Member.class);
System.out.println(member);
}
}
運作結果:
如果不設定“value-type”的屬性,也可以正确為集合設定内容。在預設情況下,Spring會利用ArrayList
為List接口對象執行個體化。
例2:設定set集合
import java.util.List;
import java.util.Set;
public class Member {
private List<String> names;
private Set<String> emails;
public void setEmails(Set<String> emails) {
this.emails = emails;
}
public void setNames(List<String> names) {
this.names = names;
}
@Override
public String toString() {
return "Member [names=" + names + ", emails=" + emails + "]";
}
}
b,修改applicationContext.xml檔案
<property name="emails">
<set>
<value>[email protected]</value>
<value>[email protected]</value>
<value>[email protected]</value>
</set>
</property>
c,編寫測試類;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.mldn.vo.Emp;
import cn.mldn.vo.Member;
public class TestDemoA {
public static void main(String[] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
Member member = ctx.getBean("member",Member.class);
System.out.println(member);
}
}
運作結果:
例3:設定map集合
import java.util.Map;
public class Member {
private Map<String,String> tels;
public void setTels(Map<String, String> tels) {
this.tels = tels;
}
@Override
public String toString() {
return "Member [tels=" + tels + "]";
}
}
b,修改applicationContext.xml檔案
<property name="tels">
<map>
<entry key="110" value="公安"/>
<entry>
<key><value>120</value></key>
<value>急救</value>
</entry>
</map>
</property>
c,編寫測試類;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.mldn.vo.Emp;
import cn.mldn.vo.Member;
public class TestDemoA {
public static void main(String[] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
Member member = ctx.getBean("member",Member.class);
System.out.println(member);
}
}
運作結果:
在Map集合裡面可以存放各種資料明類型,而不僅僅隻是字元串,最重要的是,如果要定義的是字元串可以直接利用Properties儲存。
在Memeber類中定義Properties集合:
private Properties infos;
public void setInfos(Properties infos) {
this.infos = infos;
}
修改applicationContext.xml:
<property name="infos">
<props>
<prop key="mldn">www.qq.cn</prop>
<prop key="laoli">帥哥一枚</prop>
</props>
</property>
以上就實作四種常見的集合注入過程,而所有的注入過程都是通過配置檔案顯示定義出來的。
擴充:一個部門包含有多個雇員資訊,這個時候就可以通過集合的方式來進行配置;
1,修改Dept.java類
package cn.mldn.vo;
import java.beans.ConstructorProperties;
import java.io.Serializable;
import java.util.List;
@SuppressWarnings("serial")
public class Dept implements Serializable {
private Integer deptno;
private String dname;
private String loc;
private List<Emp> emps;
public Integer getDeptno() {
return deptno;
}
public void setDeptno(Integer deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
public List<Emp> getEmps() {
return emps;
}
public void setEmps(List<Emp> emps) {
this.emps = emps;
}
@Override
public String toString() {
return "Dept [deptno=" + deptno + ", dname=" + dname + ", loc=" + loc
+ ", emps=" + emps + "]";
}
}
2,修改Emp.java類
package cn.mldn.vo;
import java.io.Serializable;
@SuppressWarnings("serial")
public class Emp implements Serializable {
private Integer empno;
private String ename;
private Dept dept;
private boolean retire;
public boolean isRetire() {
return retire;
}
public void setRetire(boolean retire) {
this.retire = retire;
}
public void setDept(Dept dept){
this.dept=dept;
}
public void setEmpno(Integer empno){
this.empno = empno;
}
public void setEname(String ename){
this.ename = ename;
}
@Override
public String toString() {
return "Emp [empno=" + empno + ", ename=" + ename + ", dept=" + dept
+ ", retire=" + retire + "]";
}
}
b,修改applicationContext.xml檔案
<bean id="dept" class="cn.mldn.vo.Dept">
<!-- 一旦使用了此标簽,就意味者要調用類中的指定屬性的setter方法 -->
<property name="deptno" value="10"/>
<property name="dname" value="開發部"/>
<property name="loc" value="北京"/>
<property name="emps">
<list>
<ref bean="empA"/>
<ref bean="empB"/>
<ref bean="empC"/>
</list>
</property>
</bean>
<bean id="empA" class="cn.mldn.vo.Emp">
<!-- 一旦使用了此标簽,就意味者要調用類中的指定屬性的setter方法 -->
<property name="empno" value="7369"/>
<property name="ename" value="SMITH"/>
<property name="dept" ref="dept"/>
<property name="retire" value="on"/>
</bean>
<bean id="empB" class="cn.mldn.vo.Emp">
<!-- 一旦使用了此标簽,就意味者要調用類中的指定屬性的setter方法 -->
<property name="empno" value="7599"/>
<property name="ename" value="ALLEN"/>
<property name="dept" ref="dept"/>
<property name="retire" value="on"/>
</bean>
<bean id="empC" class="cn.mldn.vo.Emp">
<!-- 一旦使用了此标簽,就意味者要調用類中的指定屬性的setter方法 -->
<property name="empno" value="7839"/>
<property name="ename" value="KING"/>
<property name="dept" ref="dept"/>
<property name="retire" value="on"/>
</bean>
c,編寫測試類;
package cn.mldn.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.mldn.vo.Dept;
public class TestDemoA {
public static void main(String[] args) {
// 以後這部分的代碼根本就不需要你去編寫
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
// 将容器中已經可以使用的對象接收過來進行調用,此時與執行個體化對象沒有任何的關系
Dept dept = ctx.getBean("dept", Dept.class);
System.out.println(dept);
}
}
運作結果:
Dept [deptno=10, dname=開發部, loc=北京,
emps=[Emp [empno=7369, ename=SMITH, retire=true],
Emp [empno=7599, ename=ALLEN, retire=true],
Emp [empno=7839, ename=KING, retire=true]]]
依賴注入在對于對象間的引用關系處理上非常友善使用,非常的直覺。