默认情况下,Spring将集合中所有元素作为字符串对待。如果你不打算将集合元素作为字符串使用,就必须为他们指定数据类型。可以使用<value>标记的type属性指定每个集合元素的数据类型,也可以用集合标记的value-type属性指定所有元素的数据类型。
代码示例如下:
(1)SequenceGenerator类
/*
* Copyright 2013-2015
*/
package com.jackie.codeproject.springrecipesnote.springioc;
import java.text.DecimalFormat;
import java.util.List;
/**
* Title: SequenceGenerator.java
* 序列生成器
*
* @author jackie
* @since Apr 13, 2013 12:56:57 PM
* @version V1.0
*/
public class SequenceGenerator {
/**
* @Fields prefixGenerator : 前缀生成器
*/
private PrefixGenerator prefixGenerator;
/**
* @Fields suffix : 后缀
*/
private List<Object> suffixes;
/**
* @Fields initial : 初始值
*/
private int initial;
/**
* @Fields counter : 计数器
*/
private int counter;
/**
* 获取序列号,声明为同步,使其成为线程安全的方法
* @author jackie
* @date Apr 13, 2013
* @return
* @return String
*/
public synchronized String getSquence() {
StringBuffer buffer = new StringBuffer();
buffer.append(prefixGenerator.getPrefix());
buffer.append(initial + counter++);
DecimalFormat formatter = new DecimalFormat("0000");
for (Object suffix : suffixes) {
buffer.append("-");
buffer.append(formatter.format((Integer)suffix));
}
return buffer.toString();
}
/**
* @param suffix
* the suffix to set
*/
public void setSuffixes(List<Object> suffixes) {
this.suffixes = suffixes;
}
/**
* @param initial
* the initial to set
*/
public void setInitial(int initial) {
this.initial = initial;
}
/**
* @param prefixGenerator the prefixGenerator to set
*/
public void setPrefixGenerator(PrefixGenerator prefixGenerator) {
this.prefixGenerator = prefixGenerator;
}
}
(2)PrefixGenerator接口
/*
* Copyright 2013-2015
*/
package com.jackie.codeproject.springrecipesnote.springioc;
/**
* Title: PrefixGenerator.java
* 生成前缀
*
* @author jackie
* @since Apr 18, 2013 9:54:43 PM
* @version V1.0
*/
public interface PrefixGenerator {
public String getPrefix();
}
(3)日期前缀生成器
/*
* Copyright 2013-2015
*/
package com.jackie.codeproject.springrecipesnote.springioc;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Title: DatePrefixGenerator.java
* 日期前缀
*
* @author jackie
* @since Apr 18, 2013 10:03:02 PM
* @version V1.0
*/
public class DatePrefixGenerator implements PrefixGenerator {
private DateFormat formatter;
public void setPattern(String pattern) {
this.formatter = new SimpleDateFormat(pattern);
}
@Override
public String getPrefix() {
return formatter.format(new Date());
}
}
(4)Bean配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<bean id="datePrefixGenerator" class="com.jackie.codeproject.springrecipesnote.springioc.DatePrefixGenerator">
<property name="pattern" value="yyyyMMdd" />
</bean>
<bean id="sequenceGenerator" class="com.jackie.codeproject.springrecipesnote.springioc.SequenceGenerator">
<property name="prefixGenerator" ref="datePrefixGenerator" />
<property name="initial" value="100000" />
<property name="suffixes">
<list>
<value>5</value>
<value>10</value>
<value>20</value>
</list>
</property>
</bean>
</beans>
当运行程序时会抛出ClassCastException异常,因为类型是String,无法转换成整数。可以设置<value>标记的type属性指定每个集合元素的数据类型。
<bean id="sequenceGenerator" class="com.jackie.codeproject.springrecipesnote.springioc.SequenceGenerator">
<property name="prefixGenerator" ref="datePrefixGenerator" />
<property name="initial" value="100000" />
<property name="suffixes">
<list>
<value type="int">5</value>
<value type="int">10</value>
<value type="int">20</value>
</list>
</property>
</bean>
也可以设置集合标记的value-type属性指定集合元素的数据类型。
<bean id="sequenceGenerator" class="com.jackie.codeproject.springrecipesnote.springioc.SequenceGenerator">
<property name="prefixGenerator" ref="datePrefixGenerator" />
<property name="initial" value="100000" />
<property name="suffixes">
<list value-type="int">
<value>5</value>
<value>10</value>
<value>20</value>
</list>
</property>
</bean>
Java1.5或更高版本,可以使用类型安全的集合定义,即在声明集合时便指定元素类型。
/*
* Copyright 2013-2015
*/
package com.jackie.codeproject.springrecipesnote.springioc;
...........
public class SequenceGenerator {
/**
* @Fields suffix : 后缀
*/
private List<Integer> suffixes;
..............
/**
* 获取序列号,声明为同步,使其成为线程安全的方法
* @author jackie
* @date Apr 13, 2013
* @return
* @return String
*/
public synchronized String getSquence() {
StringBuffer buffer = new StringBuffer();
buffer.append(prefixGenerator.getPrefix());
buffer.append(initial + counter++);
DecimalFormat formatter = new DecimalFormat("0000");
for (Object suffix : suffixes) {
buffer.append("-");
buffer.append(formatter.format(suffix));
}
return buffer.toString();
}
/**
* @param suffix
* the suffix to set
*/
public void setSuffixes(List<Integer> suffixes) {
this.suffixes = suffixes;
}
...............
}
一旦以类型安全的方式定义了集合,Spring就能够通过反射读取集合的类型信息,这样就不需要指定<list>的value-type属性。
<bean id="sequenceGenerator" class="com.jackie.codeproject.springrecipesnote.springioc.SequenceGenerator">
<property name="prefixGenerator" ref="datePrefixGenerator" />
<property name="initial" value="100000" />
<property name="suffixes">
<list>
<value>5</value>
<value>10</value>
<value>20</value>
</list>
</property>
</bean>