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 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");
	}
时间: 2024-10-11 00:10:09

6.4 Bean操作和BeanWrapper类之一的相关文章

6.4 Bean操作和BeanWrapper类之二

内置的PropertyEditor实现 Spring使用PropertyEditors的概念来实现Object和String的转换.如果你考虑它(PropertyEditors),那么有时候使用它来表示属性可能比对象本身更容易.比如,Date可以被表示成人类易读的方式(作为String '2008-14-09'),并且我们还可以将它转换成原始的Date(或者更好:将任何输入可读的日期,转换成Date对象).这可以通过注册自定义editors(java.beans.PropertyEditor类型

Spring 4.x Bean操作和BeanWrapper

BeanWrapper的工作方式在一定程度上是由它的名字表示:它包装一个Bean在其上执行动作,例如设置和检索属性. 在beans包中的一个很重要的类是BeanWrapper接口和它响应的实现(BeanWrapperImpl).BeanWrapper提供功能(单独或批量)设置和获取属性值,获取属性描述,和查询属性决定它们是否可读或可写.同时,BeanWrapper提供支持嵌套属性,能够设置属性的无限深度的子属性.此外,BeanWrapper支持添加标准JavaBeans的PropertyChan

拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元

 1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.第二种初始化的方式是直接在构造方法里面实现初始化. 案例如下: #include<iostream> //如果声明已经定义,边不会生成 class classA { private: int a; int b; public: //拷贝构造的规则,有两种方式实现初始化 //1.一个是通过在后面:a(x),b(y)的方式实现初始化 //2.第二种初始化的方式是直

c语言中字符串操作的工具类

 1.编写头文件 #define _CRT_SECURE_NO_WARNINGS //#pragmawarning(disable:4996) #include <stdio.h> #include <stdlib.h> #include <string.h> struct CString { char *p;        //保存字符串首地址 int reallength; //实际长度 }; typedef struct CString mystring;//

poi操作Excel工具类

在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完成的功能是:读取Excel.写入Excel.合并Excel的功能.

C#文件夹操作之Directory类和DirectoryInfo类

问题的由来 怎么样使用 Cocos2d-x 快速开发游戏,方法很简单,你可以看看其自带的例程,或者从网上搜索教程,运行起第一个HelloWorld,然后在 HelloWorld 里面写相关逻辑代码,添加我们的层.精灵等 ~ 我们并不一定需要知道 Cocos2d-x 是如何运行或者在各种平台之上运行,也不用知道 Cocos2d-x 的游戏是如何运行起来的,它又是如何渲染界面的 ~~~ 两个入口 程序入口的概念是相对的,AppDelegate 作为跨平台程序入口,在这之上做了另一层的封装,封装了不同

实例讲解如何使用C++操作MySQL数据库类

用C++操作MySQL数据库类: 注释:这几个类对处理不是很大数据量的操作是很理想的, 但不适宜特大型的数据的查询,因为源码中将查询到的数据直接放入了内存. /* *  project: *           通用模块 ( 用 c++ 处理  mysql 数据库类,像ADO ) *                  *  description: * *           通过DataBase,RecordSet,Record,Field类,实现对mysql数据库的操作 *    包括连接.

Spring 简单的配置和操作 ( 创建实体类, 配置XML文件, 调试 )

< 1 > 实体类 Person package java_spring.modle; /** * 一个实体类( Person ) */ public class Person { private int userId; private String userName; private String userAge; public int getUserId() { return userId; } public void setUserId(int userId) { this.userId

List操作的工具类

1 /** 2 * <p>list操作的工具类</p> 3 */ 4 public class ListUtil { 5 /** 6 * 过滤掉list里面才重复项 7 * 8 * @param list 9 * @return List 10 */ 11 public static List<String> filterRepeat(List<String> list){ 12 int length = list.size(); 13 for(int i