User user1 = …;
User user2 = …;
BeanUtils. copyProperties(user2,user1);
2. 不同类不同对象之间的数据复制。
UserForm userForm = …;
User user = …;
BeanUtils. copyProperties(user, userForm);
相信经常使用struts的人,一定会很熟悉上面的代码。
这是一个典型把页面的value object数据复制到domain object的例子。
3. 对象数据和Map之间互相转化。
User user = …;
Map userMap = BeanUtils.describe(user);
Map userMap = …;
User user = …;
BeanUtils.populate(user,userMap);
Map可以看成一个动态数据容器,作为VO很适合在不同层之间传播数据,作为PO也可以动态存储字段信息,
合理运用可以减少程序很多修改和维护工作。所以让bean和map之间方便的进行数据填充,非常必要。
public ConvertUtilsBean() {
converters.setFast(false);
//就是这句。
deregister();
converters.setFast(true);
}
deregister()代码如下:
public void deregister() {
boolean booleanArray[] = new boolean[0];
byte byteArray[] = new byte[0];
…
converters.clear();
register(BigDecimal.class, new BigDecimalConverter());
register(BigInteger.class, new BigIntegerConverter());
register(Boolean.TYPE, new BooleanConverter(defaultBoolean));
register(Boolean.class, new BooleanConverter(defaultBoolean));
…
}
Public class MyServerlet{
public void init(){
ConvertUtils.register(MyTypeConverter,MyType.class);
}
}
很显然,我们依然通过代码进行了配置,而且一旦脱离了servlet环境,将不再可用。 Apache Common BeanUtil的Spring配置。
如果我们采用IOC框架,那么可以通过优雅的配置对BeanUtil进行自己的定制。
以spring为例我们做如下配置。
java.sql.Timestamp
beanUtilsConfig类:
public class BeanUtilsConfig implements InitializingBean{
private Map converters = new HashMap();
public void afterPropertiesSet() throws Exception {
Set keys = converters.keySet();
for(Object key:keys){
ConvertUtils.register((Converter)converters.get(key),Class.forName((String) key));
}
}
public Map getConverters() {
return converters;
}
public void setConverters(Map converterMap) {
this.converters = converterMap;
}
}
这样就完成了在spring框架启动的时候,注册Converter类,
修改sqlTimestampConverter的Converter为默认值为null的Converter。
当然,在调用ConvertUtils.register之前,BeanUtil的默认Convertor已经注册完成。
由上可以看出IOC容器对于改进我们的设计非常有帮助,如果BeanUtil基于IOC容器开发的话,其可配置性将大大增强。
关于import org.apache.commons.beanutils.BeanUtils的一些该注意的地方:
BeanUtils支持的转换类型如下: * java.lang.BigDecimal * java.lang.BigInteger * boolean and java.lang.Boolean * byte and java.lang.Byte * char and java.lang.Character * java.lang.Class * double and java.lang.Double * float and java.lang.Float * int and java.lang.Integer * long and java.lang.Long * short and java.lang.Short * java.lang.String * java.sql.Date * java.sql.Time * java.sql.Timestamp 这里要注意一点,java.util.Date是不被支持的,而它的子类java.sql.Date是被支持的。因此如果对象包含时间类型的属性,且希望被转换的时候,一定要使用java.sql.Date类型。否则在转换时会提示argument mistype异常。