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来提供额外的操作,比如设置或检索属性值。
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是不是该对象的一个属性。避免了反射再获取全部属性再遍历的麻烦。