5.4.1 设置并获取基本和嵌套属性
使用setPropertyValue(s)和getPropertyValue(s)可以设置并获取属性,两者都带有几个重载方法。在Spring自带的java文档中对它们有更详细的描述。重要的是要知道对象属性指示的几个约定。几个例子:
表 5.1. 属性示例
| 表达式 | 说明 | 
|---|---|
name | 
表示属性name与方法getName()或isName()和setName()相对应 | 
account.name | 
表示属性account的嵌套属性name与方法getAccount().setName()或getAccount().getName()相对应 | 
account[2] | 
表示索引属性account的第三个元素。索引属性可以是array、list或其他自然排序的集合 | 
account[COMPANYNAME] | 
表示映射属性account被键COMPANYNAME索引到的映射项的值 | 
下面你会发现一些使用BeanWrapper来获取和设置属性的例子。
(如果你不打算直接使用BeanWrapper,那么下一部分对你来说并不重要。如果你仅使用DataBinder和BeanFactory以及它们开箱即用的实现,你应该跳到关于PropertyEditor部分的开头)。
考虑下面两个类:
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的某些属性:
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");