spring的类型转换机制(BeanWrapper)

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

猜你喜欢

转载自san-yun.iteye.com/blog/1689195