天天看點

Spring架構之依賴注入DI(2.0)Spring架構之依賴注入DI(2.0)

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);
   }
}
           

運作結果:

Spring架構之依賴注入DI(2.0)Spring架構之依賴注入DI(2.0)
如果不設定“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);
   }
}
           

運作結果:

Spring架構之依賴注入DI(2.0)Spring架構之依賴注入DI(2.0)

例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);
   }
}
           

運作結果:

Spring架構之依賴注入DI(2.0)Spring架構之依賴注入DI(2.0)

在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]]]
           

依賴注入在對于對象間的引用關系處理上非常友善使用,非常的直覺。