笼统的说一个系统主要是由3个部分组成的:
- 执行程序:主要负责处理业务逻辑,对接用户操作。
- 内部数据:嵌套在源码中的数据,用于指导程序运行。
- 外部数据:业务数据,外部配置数据。
内部数据本身就是程序的一部分,在Java中这些数据通常停留在类的静态成员变量中。而外部数据往往与代码无关,所以对于程序而言要“读懂”它们需要进行一些前置处理。例如用户在前端页面提交的数据我们从RequestContext中获取的数据类型都是字符串,而我们的业务需要将字符串转换成数字、列表、对象等等,这就引入了我们接下来要介绍的内容——数据类型转换。
JavaBean对于J2SE或者J2EE而言有着非常重要的意义,ORACLE为了统一各个组织对JavaBean的使用方式制定了详尽的JavaBean规范,包括BeanInfo、PropertyEditor、
PropertyEditorSupport
等方面的内容。本文会涉及到JavaBean的一些规范,但是重点是介绍Spring的数据管理。
Properties结构转换为实体
标准资源文件*.properties是Java程序常用的数据存储文件,Spring提供了BeanWrapper接口将*.properties文件中的数据转换成一个标准的JavaBean对象。看下面的例子:
有一个实体类Person:
class Person {
private String name;
private int age;
private boolean license;
private Date birtday;
private Address address;
private Map<String, String> otherInfo;
// Getter & Setter ......
}
然后可以通过BeanWrapper将Properties对象中的数据设置到对象中:
private void simpleDataBind() {
BeanWrapper wrapper = new BeanWrapperImpl(new Person());
//使用 BeanWrapper::setPropertyValue 接口设置数据
wrapper.setPropertyValue("name", "niubility");
wrapper.setPropertyValue("age", 18);
wrapper.setPropertyValue("license", true);
print(wrapper.getWrappedInstance());
//使用 Properties对象设置数据,Properties实例可以来源于*.properties文件
Properties p = new Properties();
p.setProperty("name", "From Properties");
p.setProperty("age", "25");
p.setProperty("license", "false");
p.setProperty("otherInfo[birthday]", "2000-01-01");
wrapper.setPropertyValues(p);
print(wrapper.getWrappedInstance());
}
这样,使用Spring的BeanWrapper接口,可以快速的将Properties数据结构转换为一个JavaBean实体。
除了配置单个实体的数据,BeanWrapper还可以为嵌套结构的实体设置数据。现在增加一个实体Vehicle:
public class Vehicle {
private String name;
private String manufacturer;
private Person person; //Person对象
// Getter & Setter ......
}
在Vehicle中有一个Person类型的成员变量(person域),我们可以利用下面具