BeanWrapper

时间:2022-07-02 18:37:10

1、JavaBeans

 

org.springframework.beans包遵守Sun提供的JavaBeans标准。

 

一个JavaBean需要满足以下条件:带有默认无参构造器的类,并且需要遵守一个命名规范。

 

举个例子,比如有一个属性叫bingoMadness,那么必须要有一个setter方法setBingoMadness(..)和一个getter方法getBingoMadness()

 

在 Spring中,IOC核心是在org.springframework.beans包中。而其中最为核心的部分,则是BeanWrapper。 BeanWrapper,顾名思义,就是bean的包装器。所以,它的主要工作,就是对任何一个bean,进行属性(包括内嵌属性)的设置和方法的调用。

 

2BeanWrapper

 

在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一个实例:[email protected]
    System.out.println(company.getWrappedInstance());
}

  

等等。。。

 

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