spring作为一个beanFactory,免不了要做类型转化,这些工作都是委托给BeanWrapper
先来看一个简单的例子:
Blog object = new Blog(); BeanWrapper bean = new BeanWrapperImpl(object); bean.setPropertyValue("id", "1"); bean.setPropertyValue("buyable", "true"); System.out.println(object.getId()); System.out.println(object.isBuyable());
BeanWrapper具体又是怎么做类型转换的呢?其实是通过PropertyEditorSupport,这个类实现了PropertyEditor,它有各种类型的继承类,比如CustomNumberEditor,CustomDateEditor分别处理Number和日志类型。
另外spring还提供了很多助手方法来获取bean的信息,比如要获取一个方法的参数信息:
PropertyDescriptor pd = bean.getPropertyDescriptor(propertyName);
MethodParameter mp = BeanUtils.getWriteMethodParameter(pd);
查看一个bean是否可写:
bean.isWritableProperty()
当然,最强大的是能嵌套设置属性,如:
//tb中有个spouse的属性,也为TestBean,这样
bw.setPropertyValue("spouse.name", "tom");
//等价于tb.getSpouse().setName("tom");
//bw 同样支持数组和集合,map属性设置
bw.getPropertyValue("array[0].name");
bw.getPropertyValue("map[key4][0].name");
beans包 还提供了一个PropertyValues用于保存多个属性值,默认的实现MutablePropertyValues
MutablePropertyValues pvs = new MutablePropertyValues();
pvs.addPropertyValue("array[0].name", "name5");
pvs.addPropertyValue("array[1].name", "name4");
bw.setPropertyValues(pvs);
参考:http://www.iteye.com/topic/43048