从头认识Spring-1.11 注入List或Set(这个例子比较体现代码复用)

Posted 李灵晖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从头认识Spring-1.11 注入List或Set(这个例子比较体现代码复用)相关的知识,希望对你有一定的参考价值。

这一章节我们来讨论一下注入List或Set。

我们章节举的例子是不同的厨师使用不同个烤炉制作出不同的蛋糕。

1.domain

蛋糕类:(沿用前面章节的蛋糕类)

package com.raylee.my_new_spring.my_new_spring.ch01.topic_1_11;

public class Cake {

	private final int id = index++;

	private static int index = 0;

	private String name = "";

	private double size = 0;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public double getSize() {
		return size;
	}

	public void setSize(double size) {
		this.size = size;
	}

	public int getId() {
		return id;
	}

	@Override
	public String toString() {
		return " create the cake,its id:" + id + ", size:" + size + " inch ,name:" + name;
	}
}

厨师类:

package com.raylee.my_new_spring.my_new_spring.ch01.topic_1_11;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;

public class Chief {

	private static int index = 0;

	private ArrayList<Cake> cakes = null;

	private final int id = index++;

	private String name = "";

	private HashSet<Oven> ovens = null;

	public ArrayList<Cake> getCakes() {
		return cakes;
	}

	public int getId() {
		return id;
	}

	public String getName() {
		return name;
	}

	public HashSet<Oven> getOvens() {
		return ovens;
	}

	public ArrayList<Cake> makeCakes() {
		for (Iterator<Cake> iterator = cakes.iterator(); iterator.hasNext();) {
			Cake cake = iterator.next();
			System.out.println(name + cake);
		}
		return getCakes();
	}

	public void userOvens() {
		for (Iterator<Oven> iterator = ovens.iterator(); iterator.hasNext();) {
			Oven oven = iterator.next();
			System.out.println("use " + oven);
		}
	}

	public void setCakes(ArrayList<Cake> cakes) {
		this.cakes = cakes;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setOvens(HashSet<Oven> ovens) {
		this.ovens = ovens;
	}

}

厨师类这里需要解释一下:

(1)为了使用不同的烤炉,我们加入了ovens,由于实际情况当中只有大小烤炉各一个,所以我们这里只是使用set,而不是使用list

(2)为了能够做出不同的蛋糕,我们使用一个list来放置不同的蛋糕,而这里允许重复,因此这里使用list

(3)为了输出方便,我在userOvens和makeCakes里面直接输出数据


烤炉类:(没什么变化,只是去掉id,增加了名称属性,这样方便输出)

package com.raylee.my_new_spring.my_new_spring.ch01.topic_1_11;

public class Oven {
	private String name = "";

	@Override
	public String toString() {
		return name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

2.测试类:

package com.raylee.my_new_spring.my_new_spring.ch01.topic_1_11;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
		"/com/raylee/my_new_spring/my_new_spring/ch01/topic_1_11/ApplicationContext-test.xml" })
public class ChiefTest {

	@Autowired
	private ApplicationContext applicationContext;

	@Test
	public void testChief() {
		Chief jack = (Chief) applicationContext.getBean("jack");
		jack.userOvens();
		jack.makeCakes();
		Chief rose = (Chief) applicationContext.getBean("rose");
		rose.userOvens();
		rose.makeCakes();
	}
}

测试类继续沿用前面的方式,从容器里面取出不同的厨师对象,然后厨师就开始使用烤炉制作蛋糕。


3.配置文件(重点,也是体现代码重用的地方)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
		http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
	
	<bean id="blueberryCheeseCake"
		class="com.raylee.my_new_spring.my_new_spring.ch01.topic_1_11.Cake"
		p:name="blueberry cheese cake" p:size="5" scope="prototype">
	</bean>

	<bean id="chocolateCheeseCake"
		class="com.raylee.my_new_spring.my_new_spring.ch01.topic_1_11.Cake"
		p:name="chocolate cheese cake" p:size="6" scope="prototype">
	</bean>

	<bean id="bananaAatmelMousseCake"
		class="com.raylee.my_new_spring.my_new_spring.ch01.topic_1_11.Cake"
		p:name="banana oatmel mousse cake" p:size="7" scope="prototype">
	</bean>

	<bean id="vanillaEclair"
		class="com.raylee.my_new_spring.my_new_spring.ch01.topic_1_11.Cake"
		p:name="vanilla eclair" p:size="8" scope="prototype">
	</bean>

	<bean id="ligueurPerfumedTripletCake"
		class="com.raylee.my_new_spring.my_new_spring.ch01.topic_1_11.Cake"
		p:name="ligueur perfumed triplet cake" p:size="5.5" scope="prototype">
	</bean>

	<bean id="bigOven"
		class="com.raylee.my_new_spring.my_new_spring.ch01.topic_1_11.Oven"
		p:name="bigOven" />

	<bean id="smallOven"
		class="com.raylee.my_new_spring.my_new_spring.ch01.topic_1_11.Oven"
		p:name="smallOven" />


	<bean id="jack"
		class="com.raylee.my_new_spring.my_new_spring.ch01.topic_1_11.Chief"
		p:name="jack">
		<property name="ovens">
			<set>
				<ref bean="bigOven" />
				<ref bean="bigOven" />
				<ref bean="smallOven" />
			</set>
		</property>
		<property name="cakes">
			<list>
				<ref bean="blueberryCheeseCake" />
				<ref bean="chocolateCheeseCake" />
				<ref bean="bananaAatmelMousseCake" />
				<ref bean="vanillaEclair" />
			</list>
		</property>
	</bean>

	<bean id="rose"
		class="com.raylee.my_new_spring.my_new_spring.ch01.topic_1_11.Chief"
		p:name="rose">
		<property name="ovens">
			<set>
				<ref bean="smallOven" />
			</set>
		</property>
		<property name="cakes">
			<list>
				<ref bean="vanillaEclair" />
				<ref bean="ligueurPerfumedTripletCake" />
				<ref bean="chocolateCheeseCake" />
			</list>
		</property>
	</bean>

</beans>

需要解释一下的地方:

(1)我们利用一个蛋糕类,通过名称等属性的变化,来创建不同类别的蛋糕对象

(2)我们利用一个烤炉类,通过名称等属性的变化,来创建不同类别的烤炉对象

(3)我们利用一个厨师类,通过名称等属性的变化,来创建不同类别的厨师对象

注:上面这几点比较能够体现代码的复用

(4)每个蛋糕Bean都需要使用prototype的作用域,这样才能够每次创建的都是不同的蛋糕对象,不然后面get蛋糕的时候就会出现两个相同id的蛋糕,这个明显是不符合实际情况的。

(5)但是烤炉的情况不一样,由于对于面包铺来说,烤炉的数量是一定的,不能够出现多个烤炉,因此他们必须使用默认的单例模式

(6)配置厨师里面的烤炉属性时,我们使用了set,这样即便像上面配置多了,也不会重复出现,因为这个collection具备了set的特性;而配置蛋糕属性的时候我们使用list,由于每一个蛋糕都不一样,因此使用list比较合适

(7)list和set除了上面的能够放入Bean之外,还可以放入value,这个时候只需要使用<value/>标签即可,不是使用<ref/>,但是由于注入值比较少,因此不作详细说明。


测试输出:

use bigOven
use smallOven
jack create the cake,its id:0, size:5.0 inch ,name:blueberry cheese cake
jack create the cake,its id:1, size:6.0 inch ,name:chocolate cheese cake
jack create the cake,its id:2, size:7.0 inch ,name:banana oatmel mousse cake
jack create the cake,its id:3, size:8.0 inch ,name:vanilla eclair
use smallOven
rose create the cake,its id:4, size:8.0 inch ,name:vanilla eclair
rose create the cake,its id:5, size:5.5 inch ,name:ligueur perfumed triplet cake
rose create the cake,its id:6, size:6.0 inch ,name:chocolate cheese cake


总结:这一章节我们主要介绍了注入List或Set。


目录:http://blog.csdn.net/raylee2007/article/details/50611627 

 

我的github:https://github.com/raylee2015/my_new_spring




以上是关于从头认识Spring-1.11 注入List或Set(这个例子比较体现代码复用)的主要内容,如果未能解决你的问题,请参考以下文章

从头认识Spring-1.4 通过构造器注入Bean

从头认识Spring-1.7 怎样通过属性注入Bean?-怎样通过属性向对象注入值?

从头认识Spring-1.9 内部类注入Bean

从头认识Spring-1.1 什么是依赖注入?为什么须要依赖注入?

从头认识Spring-1.10 使用命名空间p来注入属性

从头认识Spring-1.7 怎样通过属性注入Bean?-怎样通过属性向对象注入另一个对象的引用?