6.4 Bean操作和BeanWrapper类之一

由于6.1节篇幅较长,所以分为两篇文章来翻译


6.4 Bean操作和BeanWrapper类

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 PropertyChangeListenersVetoableChangeListeners而并不需要在目标类中提供代码。 最后一点也很重要,BeanWrapper支持设置带索引的属性。BeanWrapper通常不直接被应用程序代码所使用,但在DataBinderBeanFactory中却不然。

BeanWrapper就像它的名字一样:包装一个bean来提供额外的操作,比如设置或检索属性值。


设置和获取基本的和嵌套的属性

使用setPropertyValue(s)getPropertyValue(s)这两个方法来设置和获取属性。这两个方法都包含一对重载方法。需要了解的是,在表明一个对象的属性上有一些约定,比如:

在下面你将会找到一些使用BeanWrapper来获取和设置属性的例子

(如果你并不打算直接使用BeanWrapper来工作,那么下一节对你来说并不是非常重要。如果你仅仅只是使用DataBinderBeanFactory和它们封装好了的实现,那么你应该跳到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;
	}
}

下面的代码片段显示了如何检索和操作CompaniesEmployees的属性

	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");
	}




你可能感兴趣的:(spring)