《Spring Recipes》第一章笔记:Defining Collections Usin...

问题:

使用基本的集合标签,无法指定集合的类型,如LinkedList,TreeSet,TreeMap。并且,不能使用refer功能,在不同的bean配置中共享集合。


解决方案:

Spring提供ListFactoryBean,SetFactoryBean,MapFactoryBean和 Utility Schema来解决此类问题。

1.使用FactoryBen 定义集合。

FactoryBean的targetXXXClass属性值指定集合类型,sourceXXX属性指定集合元素的值。

<bean id="sequenceGenerator" class="com.apress.springrecipes.sequence.SequenceGenerator">
	<property name="prefixGenerator" ref="datePrefixGenerator" />
	<property name="initial" value="100000" />
	
	<property name="suffixes">
		<!-- 使用FactoryBean -->
		<bean class="org.springframework.beans.factory.config.SetFactoryBean">
                        <!-- 设置集合类型 -->
			<property name="targetSetClass">
				<value>java.util.TreeSet</value>
			</property>
                        <!-- 设置集合元素 -->
			<property name="sourceSet">
				<set>
				    <value>5</value>
				    <value>10</value>
				    <value>20</value>
				</set>
			</property>
		</bean>
	</property>
	
</bean>

2.使用util schema设置集合类型和集合元素。

beans标签中添加xmlns:util="http://www.springframework.org/schema/util",xsi:schemaLocation中添加http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd">
	<bean id="sequenceGenerator" class="com.apress.springrecipes.sequence.SequenceGenerator">
		<property name="suffixes">
                        <!-- 设置集合类型 -->
			<util:set set-class="java.util.TreeSet">
                                <!-- 设置集合元素 -->
				<value>5</value>
				<value>10</value>
				<value>20</value>
			</util:set>
		</property>
	</bean>

</beans>

3.使用FactoryBen定义stand-alone 集合。

<beans ...>
	<bean id="sequenceGenerator" class="com.apress.springrecipes.sequence.SequenceGenerator">
		<property name="suffixes">
			<ref local="suffixes" />
		</property>
	</bean>

	<bean id="suffixes" class="org.springframework.beans.factory.config.SetFactoryBean">
                <!-- 设置集合类型 -->
	        <property name="targetSetClass">
		    <value>java.util.TreeSet</value>
    	        </property>
                <!-- 设置集合元素 -->
		<property name="sourceSet">
			<set>
				<value>5</value>
				<value>10</value>
				<value>20</value>
			</set>
		</property>
	</bean>

</beans>

4.使用Utility Schema定义stand-alone 集合。

<beans ...>
<bean id="sequenceGenerator"
class="com.apress.springrecipes.sequence.SequenceGenerator">
	<property name="suffixes">
		<ref local="suffixes" />
	</property>
</bean>

<util:set id="suffixes" set-class="java.util.TreeSet" >
	<value>5</value>
	<value>10</value>
	<value>20</value>
</util:set>

</beans>

5.集合的类型必须为java.util.Set,java.util.List,java.util.Map的子类型,否则容器初始化会抛出异常。

你可能感兴趣的:(spring)