BeanWrapper

非淡泊无以明志,非宁静无以致远。这篇文章主要讲述BeanWrapper相关的知识,希望能为你提供帮助。
1、JavaBeans
 
org.springframework.beans包遵守Sun提供的javaBeans标准。
 
一个JavaBean需要满足以下条件:带有默认无参构造器的类,并且需要遵守一个命名规范。
 
举个例子,比如有一个属性叫bingoMadness,那么必须要有一个setter方法setBingoMadness(..)和一个getter方法getBingoMadness()
 
在 Spring中,IOC核心是在org.springframework.beans包中。而其中最为核心的部分,则是BeanWrapper。 BeanWrapper,顾名思义,就是bean的包装器。所以,它的主要工作,就是对任何一个bean,进行属性(包括内嵌属性)的设置和方法的调用。
 
2、BeanWrapper
 
在beans包中一个相当重要的类— — BeanWrapper接口和它对应的实现(BeanWrapperImpl)。
 
Javadoc中说到,BeanWrapper可以设置(set)和获取(get)属性值(单独地或者大批量的)、可以得到属性描述符(property  descriptors),也可以查询属性是否可读或可写。BeanWrapper还支持嵌套属性,能够设置子属性的属性并支持无限的延伸。
 
另外,BeanWrapper支持添加标准Javabens  PropertyChangeListeners和VetoableChangeListeners,而并不需要在目标类中提供代码。 
 
最后一点也很重要,BeanWrapper支持设置带索引的属性。
 
BeanWrapper就像它的名字一样:包装一个bean来提供额外的操作,比如设置或检索属性值。
【BeanWrapper】 
3、设置和获取基本的和嵌套的属性
 
假设有两个类

public class Company { private String name; private Employee managingDirector; public String getName() { return this.name; } public void setName(String name) { this.name = name; } public Employee getManagingDirector() { return this.managingDirector; } public void setManagingDirector(Employee managingDirector) { this.managingDirector = managingDirector; } }

public class Employee { private String name; private float salary; public String getName() { return this.name; } public void setName(String name) { this.name = name; } public float getSalary() { return salary; } public void setSalary(float salary) { this.salary = salary; } }


 
可以使用BeanWrapper操作
BeanWrapper company = new BeanWrapperImpl(new Company()); company.setPropertyValue("name", "Some Company Inc."); BeanWrapper employee = new BeanWrapperImpl(new Employee()); employee.setPropertyValue("name", "Jim Stravinsky"); company.setPropertyValue("managingDirector", employee.getWrappedInstance()); String name = (String) company.getPropertyValue("managingDirector.name"); System.out.println(name); 最终输出:Jim Stravinsky

 
4、其他方法
 
public void testClassMethods(){ BeanWrapper company = new BeanWrapperImpl(new Company()); //获取属性的class类:class java.lang.String System.out.println(company.getPropertyType("name")); //是否可读:true System.out.println(company.isReadableProperty("name")); //是否可读:false System.out.println(company.isReadableProperty("nameSelf")); //new一个实例:com.agan.spring.beanwrapper.Company@4cc0edeb System.out.println(company.getWrappedInstance()); }


等等。。。
 
根据经验,是否可读,可以的情况:有一个String,可以用此方法判断这个String是不是该对象的一个属性。避免了反射再获取全部属性再遍历的麻烦。
 

    推荐阅读