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

运行结果:
在这里片描述

  如果不设置“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>nihao@mldn.cn</value>
           <value>lihao@mldn.cn</value>
           <value>hello@mldn.cn</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]]]

依赖注入在对于对象间的引用关系处理上非常方便使用,非常的直观。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值