由于6.1节篇幅较长,所以分为两篇文章来翻译
org.springframework.beans包遵守Sun提供的JavaBeans标准。一个JavaBean需要满足以下条件:带有默认无参构造器的类,并且需要遵守一个命名规范,举个例子,比如有一个属性叫bingoMadness,那么必须要有一个setter方法setBingoMadness(..)和一个getter方法getBingoMadness()。更多关于JavaBeans的信息,可以参考Sun的网站( java.sun.com/products/javabeans)。
在beans包中一个相当重要的类——BeanWrapper接口和它对应的实现(BeanWrapperImpl)。Javadoc中说到,BeanWrapper可以设置(set)和获取(get)属性值(单独地或者大批量的)、可以得到属性描述符(property descriptors),也可以查询属性是否可读或可写。BeanWrapper还支持嵌套属性,能够设置子属性的属性并支持无限的延伸。另外,BeanWrapper支持添加标准Javabens PropertyChangeListeners和VetoableChangeListeners,而并不需要在目标类中提供代码。 最后一点也很重要,BeanWrapper支持设置带索引的属性。BeanWrapper通常不直接被应用程序代码所使用,但在DataBinder和BeanFactory中却不然。
BeanWrapper就像它的名字一样:包装一个bean来提供额外的操作,比如设置或检索属性值。
使用setPropertyValue(s)和getPropertyValue(s)这两个方法来设置和获取属性。这两个方法都包含一对重载方法。需要了解的是,在表明一个对象的属性上有一些约定,比如:
在下面你将会找到一些使用BeanWrapper来获取和设置属性的例子
(如果你并不打算直接使用BeanWrapper来工作,那么下一节对你来说并不是非常重要。如果你仅仅只是使用DataBinder,BeanFactory和它们封装好了的实现,那么你应该跳到PropertyEditors这一节)
考虑下面2个类
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; } }
下面的代码片段显示了如何检索和操作Companies和Employees的属性
public static void main(String args[]) { BeanWrapper company = new BeanWrapperImpl(new Company()); // setting the company name.. company.setPropertyValue("name", "Some Company Inc."); // ... can also be done like this: PropertyValue value = new PropertyValue("name", "Some Company Inc."); company.setPropertyValue(value); // ok, let's create the director and tie it to the company: BeanWrapper jim = new BeanWrapperImpl(new Employee()); jim.setPropertyValue("name", "Jim Stravinsky"); company.setPropertyValue("managingDirector", jim.getWrappedInstance()); // retrieving the salary of the managingDirector through the company Float salary = (Float) company .getPropertyValue("managingDirector.salary"); }