Spring Framework Reference 中文版
WORK IN PROGRESS!!!
版本: 1.0
http://xglw.51.net/5team/springframework Spring reference 中文版 1.0
1. 第一章.简介
1.1. 轻量级容器
这章内容没什么价值,需要修正
最近,许多人对我们所说的“轻量级容器”表现出兴趣。我们认为这是一个趋势。轻量级容器对
于 web 应用的意义尤为明显;但对于其他类型的应用(包括在 J2EE 环境中运行的应用和独立的应用)
来说,轻量级容器也有助于提高它们的复用程度,例如业务对象和数据访问对象(DAO)的复用。
什么是轻量级容器? EJB 可能是最好的反例:
1. 侵略性的 API(你的代码依赖于 EJB)
2. 对容器的依赖(你的代码不能在 EJB 容器之外工作)
3. 只提供固定的一组功能,不具备配置能力
4.
5. 启动时间长
6. 部署过程取决于特定的产品,无法通用
轻量级容器的目标是避免上面所有这些麻烦事情.
1.2. 几句闲谈
在这里多谈谈 Spring!
2. 第二章.高层面概述
2.1. 简介
简单地说,Spring 是一个以控制倒置(Inversion of Control)原则为基础的轻量级框架。控制
倒置是一个用于“基于组件的体系结构”的设计模式,它将“判断依赖关系”的职责移交给容器,而
不是由组件本身来判断彼此之间的依赖关系。当在 Spring 内实现组件时, 容器“轻量级”的方面就
展现出来了:针对 Spring 开发的组件不需要任何外部库;而且, 容器是轻量级的,它避免了像 EJB
容器那样的重量级方案的主要缺点,例如启动时间长、测试复杂、部署和配置困难,等等。
这一章首先介绍了轻量级容器的总体设计,随后将简单介绍 Spring 除 IoC 实现之外的特性。简
单说,这些特性包括:
* 内置 AOP 支持,例如在 EJB 容器之外提供声明式事务管理
http://xglw.51.net/5team/springframework Spring reference 中文版 1.0
* 数据访问框架,支持 JDBC 和 O/R mapping 产品(例如 Hibernate)
* 与 Spring framework 其他功能完全集成的 MVC web 框架,提供一种清晰、无侵略性
的 MVC 实现方式,使你无须绑定任何一种特定的视图技术
* 用 JavaMail 或其他邮件系统发送邮件的支持
* 源代码级别的元数据支持,使开发者可以借助 AOP 之类的技术进行企业服务建模
* JNDI 抽象层,便于改变实现细节,例如透明地在远程服务和本地服务之间切换
此外,这一章将指导你“什么时候为特定的项目选择 Spring”。对于 Spring 和 IoC 的一些
优势(以及缺陷),本章也将提供整体性的概述。
3. 第三章.Bean相关包
3.1. 介绍
TODO:我的看法是作一个概括性的描述,帮助读者基本了解 beans 包能做些什么。然而,如你所
见,这是一件非常困难的事……我必须作更多的考量……这需要增加更多关于 IOC 的信息,以及一些
有关 type2 和 type3 的资料……
Spring 的核心是 org.springframework.beans 包,为使用 JavaBeans 技术、按名检索对象及管
理对象间的关系而设计。beans 包及其子包提供的功能为使用 JavaBeans 技术的项目指定了一个基础
设施。
关于 beans 包,有三个重要的概念。首先,它提供了设置/读取 Javabeans 属性功能的 BeanWrapper
接口。第二个重要概念是 Bean 工厂。BeanFactory 是一个泛化工厂,具有实例化对象和管理不同对
象间关系的能力。BeanFactory 可以管理几种不同类型的 bean,并且支持串行化及其他生命周期方法。
BeanFactory 是按照 bean 定义(BeanDefinition)来实例化对象的。BeanDefinition,顾名思义,
是你对 bean 的定义。BeanDefinition 不仅定义了 bean 的类结构、实例化的方式,还定义了 bean 在
运行时的合作者。这是第三个概念。这三个概念(
BeanFactory
,
BeanWrapper
and
BeanDefinition
)
将在下文详细讨论。
3.2. 使用 BeanWrapper 接口操作 Bean
对于 org.springframework.beans 包遵循 Sun 公司发布的 JavaBeans 标准。所谓“JavaBean”其
实就是一个 Java 类。不过,它必须拥有默认无参数构造器,并按照既定规则来命名属性——属性 prop
对应一个设置器 setProp(…)和读取器 getProp(…)。更多的关于 JavaBeans 的信息请查阅 Sun 公司
网站(java.sun.com/products/javabeans[http://java.sun.com/products/javabeans/]).
一个对于 benas 包非常重要的概念是 BeanWrapper 接口及与之对应的实现(BeanWrapperImpl 类)。
如 JavaDoc 中所载,BeanWrapper 接口提供了设置和读取属性值、获得属性描述以及查询属性是否可
读写的功能。BeanWrapper 也提供了嵌套属性的支持,允许设置无限深度的子属性。同时,BeanWrapper
接口还允许你加入标准 JavaBeans 规范中的 PropertyChangeListeners 接口和
http://xglw.51.net/5team/springframework Spring reference 中文版 1.0
VetoableChangeListeners 接口,从而提供订阅属性变化消息和否决属性变化通知的能力,而不需要
在目标类中加入额外的支持代码。最后,BeanWrapper 接口提供了按索引随机设置带索引属性(例如
类型为 List 或数组的属性)的支持。BeanWrapper 接口通常并不是直接在应用程序代码中使用,而
是由 DataBinder 接口和 BeanFactory 管理。
BeanWrapper 接口的这种工作方式多少就如它的名字所暗示的:对 bean 进行包装,然后对包装
后的 bean 加以操作,例如设置属性值、检索属性值等等。
3.2.1. 设置和读取基本属性及嵌套属性
设置和读取属性分别通过 setPropertyValue(s)方法和 getPropertyValue(s)方法来完成。为了
方便使用,这两个方法都有几个重载版本。有关这两组方法的详尽描述在 Spring 的 JavaDoc 中给出。
在这里,你有必要首先了解“标识对象的属性”的几种命名规则。下面是几个例子:
Table 3.1. Examples of properties
表达式 说明
name 表示属性“name”,对应的方法是 getName()或者 isName()或者
setName()
account.name 表示属性“ account”的嵌套属性“name”,对应的方法是
getAccount().setName()或者 getAccount().getName()
account[2] 表示带索引属性“account”的第三个元素。带索引属性可以是 array
类型、list 类型或者其他普通的 collection
下面你会找到几个使用 BeanWrapper 接口读取和设置属性的例子。
注意:假如你不打算直接使用 BeanWrapper 接口的话,这个部分对你来说并不太重要。假如你只
打算使用 DataBinder 和 BeanFactory 公开提供的功能,请放心地跳过这些例子,直接进入有关
PropertyEditors 的内容。
考虑如下两个类:
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;
http://xglw.51.net/5team/springframework Spring reference 中文版 1.0
}
}
public class Employee {
private float salary;
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
}
下面的代码片断展示如何检索和操作 Companies 类和 Employees 类实例属性的几个例子。
Company c = new Company();
BeanWrapper bwComp = BeanWrapperImpl(c);
// setting the company name...
bwComp.setPropertyValue("name", "Some Company Inc.");
// ... can also be done like this:
PropertyValue v = new PropertyValue("name", "Some Company Inc.");
bwComp.setPropertyValue(v);
// ok, let's create the director and tie it to the company:
Employee jim = new Employee();
BeanWrapper bwJim = BeanWrapperImpl(jim);
bwJim.setPropertyValue("name", "Jim Stravinsky");
bwComp.setPropertyValue("managingDirector", jim);
// retrieving the salary of the managingDirector through the company
Float salary = (Float)bwComp.getPropertyValue("managingDirector.salary");
3.2.2. 使用 PropertyEditors 包转换属性
有时候,为了使用方便,我们需要以另一种形式展现对象的属性。例如,日期可以以一种更容易
阅读的形式表现出来,同时我们也会将人们熟悉的格式转换回原始的日期格式(或者使用一个更好的
办法:将所有用户偏好形式转换回统一的 java.util.Date 对象)。为了达到这一目的,我们可以编
写自定义编辑器,使其继承 java.beans.PropertyEditor 类型,并将自定义编辑器注册到 BeanWrapper
上。通过注册, BeanWrapper 将知道“如何把属性转换所需类型的信息”。请阅读 Sun 公司提供的
java.beans 包中 PropertyEditors 的 JavaDoc 获得进一步信息。
下面的例子将使用 PropertyEditor,把 java.util.Date 对象转换为人们习惯的形式:
/** Details in this class are excluded for brevity */
http://xglw.51.net/5team/springframework Spring reference 中文版 1.0