Spring Framework 开发参考手册

Authors

Rod Johnson, Juergen Hoeller, Alef Arendsen, Colin Sampaleanu, Rob Harrop, Thomas Risberg, Darren Davison, Dmitriy Kopylenko, Mark Pollack, Thierry Templier, Erwin Vervaet, Portia Tung, Ben Hale, Adrian Colyer, John Lewis, Costin Leau, Mark Fisher, Sam Brannen, Ramnivas Laddad

2.5.2

Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically.


Table of Contents

前言
1. 简介
1.1. 概览
1.1.1. 使用场景
2. Spring 2.0和 2.5的新特性
2.1. 简介
2.2. 控制反转(IoC)容器
2.2.1. 新的bean作用域
2.2.2. 更简单的XML配置
2.2.3. 可扩展的XML编写
2.2.4. Annotation(注解)驱动配置
2.2.5. 在classpath中自动搜索组件
2.3. 面向切面编程(AOP)
2.3.1. 更加简单的AOP XML配置
2.3.2. 对@AspectJ 切面的支持
2.3.3. 对bean命名pointcut( bean name pointcut element)的支持
2.3.4. 对AspectJ装载时织入(AspectJ load-time weaving)的支持
2.4. 中间层
2.4.1. 在XML里更为简单的声明性事务配置
2.4.2. 对Websphere 事务管理的完整支持
2.4.3. JPA
2.4.4. 异步的JMS
2.4.5. JDBC
2.5. Web层
2.5.1. Spring MVC合理的默认值
2.5.2. Portlet 框架
2.5.3. 基于Annotation的控制器
2.5.4. Spring MVC的表单标签库
2.5.5. 对Tiles 2 支持
2.5.6. 对JSF 1.2支持
2.5.7. JAX-WS支持
2.6. 其他
2.6.1. 动态语言支持
2.6.2. 增强的测试支持
2.6.3. JMX 支持
2.6.4. 将Spring 应用程序上下文部署为JCA adapter
2.6.5. 计划任务
2.6.6. 对Java 5 (Tiger) 支持
2.7. 移植到Spring 2.5
2.7.1. 改变
2.7.1.1. 支持的JDK版本
2.7.1.2. Spring 2.5的Jar打包
2.7.1.3. XML配置
2.7.1.4. Deprecated(淘汰)的类和方法
2.7.1.5. Apache OJB
2.7.1.6. iBATIS
2.7.1.7. Hibernate
2.7.1.8. JDO
2.7.1.9. UrlFilenameViewController
2.8. 更新的样例应用
2.9. 改进的文档
I. 核心技术
3. IoC(控制反转)容器
3.1. 简介
3.2. 基本原理 - 容器和bean
3.2.1. 容器
3.2.1.1. 配置元数据
3.2.2. 实例化容器
3.2.2.1. XML配置元数据的结构
3.2.3. 多种bean
3.2.3.1. bean的命名
3.2.3.2. 实例化bean
3.2.4. 使用容器
3.3. 依赖
3.3.1. 注入依赖
3.3.1.1. 构造器注入
3.3.1.2. Setter注入
3.3.1.3. 一些例子
3.3.2. 依赖配置详解
3.3.2.1. 直接变量(基本类型、Strings类型等。)
3.3.2.2. 引用其它的bean(协作者)
3.3.2.3. 内部bean
3.3.2.4. 集合
3.3.2.5. Nulls
3.3.2.6. XML配置文件的简写及其他
3.3.2.7. 组合属性名称
3.3.3. 使用depends-on
3.3.4. 延迟初始化bean
3.3.5. 自动装配(autowire)协作者
3.3.5.1. 将bean排除在自动装配之外
3.3.6. 依赖检查
3.3.7. 方法注入
3.3.7.1. Lookup方法注入
3.3.7.2. 自定义方法的替代方案
3.4. Bean的作用域
3.4.1. Singleton作用域
3.4.2. Prototype作用域
3.4.3. Singleton beans和prototype-bean的依赖
3.4.4. 其他作用域
3.4.4.1. 初始化web配置
3.4.4.2. Request作用域
3.4.4.3. Session作用域
3.4.4.4. global session作用域
3.4.4.5. 作用域bean与依赖
3.4.5. 自定义作用域
3.4.5.1. 创建自定义作用域
3.4.5.2. 使用自定义作用域
3.5. 定制bean特性
3.5.1. 生命周期回调
3.5.1.1. 初始化回调
3.5.1.2. 析构回调
3.5.1.3. 缺省的初始化和析构方法
3.5.1.4. 组合生命周期机制
3.5.1.5. 在非web应用中优雅地关闭Spring IoC容器
3.5.2. 了解自己
3.5.2.1. BeanFactoryAware
3.5.2.2. BeanNameAware
3.6. bean定义的继承
3.7. 容器扩展点
3.7.1. 用BeanPostProcessor定制bean
3.7.1.1. 使用BeanPostProcessor的Hello World示例
3.7.1.2. RequiredAnnotationBeanPostProcessor示例
3.7.2. 用BeanFactoryPostProcessor定制配置元数据
3.7.2.1. PropertyPlaceholderConfigurer示例
3.7.2.2. PropertyOverrideConfigurer示例
3.7.3. 使用FactoryBean定制实例化逻辑
3.8. The ApplicationContext
3.8.1. BeanFactory 还是 ApplicationContext?
3.8.2. 利用MessageSource实现国际化
3.8.3. 事件
3.8.4. 底层资源的访问
3.8.5. ApplicationContext在WEB应用中的实例化
3.9. 粘合代码和可怕的singleton
3.10. 以J2EE RAR文件的形式部署Spring ApplicationContext
3.11. 基于注解(Annotation-based)的配置
3.11.1. @Autowired
3.11.2. 基于注解的自动连接微调
3.11.3. CustomAutowireConfigurer
3.11.4. @Resource
3.11.5. @PostConstruct 与 @PreDestroy
3.12. 对受管组件的Classpath扫描
3.12.1. @Component和更多典型化注解
3.12.2. 自动检测组件
3.12.3. 使用过滤器自定义扫描
3.12.4. 自动检测组件的命名
3.12.5. 为自动检测的组件提供一个作用域
3.12.6. 用注解提供限定符元数据
3.13. 注册一个LoadTimeWeaver
4. 资源
4.1. 简介
4.2. Resource接口
4.3. 内置 Resource 实现
4.3.1. UrlResource
4.3.2. ClassPathResource
4.3.3. FileSystemResource
4.3.4. ServletContextResource
4.3.5. InputStreamResource
4.3.6. ByteArrayResource
4.4. ResourceLoader接口
4.5. ResourceLoaderAware 接口
4.6. 把Resource作为属性来配置
4.7. Application context 和Resource 路径
4.7.1. 构造application context
4.7.1.1. 创建 ClassPathXmlApplicationContext 实例 - 简介
4.7.2. Application context构造器中资源路径的通配符
4.7.2.1. Ant风格的pattern
4.7.2.2. classpath*: 前缀
4.7.2.3. 其他关于通配符的说明
4.7.3. FileSystemResource 说明
5. 校验,数据绑定,BeanWrapper,与属性编辑器
5.1. 简介
5.2. 使用Spring的Validator接口进行校验
5.3. 从错误代码到错误信息
5.4. Bean处理和BeanWrapper
5.4.1. 设置和获取属性值以及嵌套属性
5.4.2. 内建的PropertyEditor实现
5.4.2.1. 注册用户自定义的PropertyEditor
6. 使用Spring进行面向切面编程(AOP)
6.1. 简介
6.1.1. AOP概念
6.1.2. Spring AOP的功能和目标
6.1.3. AOP代理
6.2. @AspectJ支持
6.2.1. 启用@AspectJ支持
6.2.2. 声明一个切面
6.2.3. 声明一个切入点(pointcut)
6.2.3.1. 切入点指示符(PCD)的支持
6.2.3.2. 组合切入点表达式
6.2.3.3. 共享通用切入点定义
6.2.3.4. 示例
6.2.4. 声明通知
6.2.4.1. 前置通知
6.2.4.2. 后置通知(After returning advice)
6.2.4.3. 异常通知(After throwing advice)
6.2.4.4. 最终通知(After (finally) advice)
6.2.4.5. 环绕通知
6.2.4.6. 通知参数(Advice parameters)
6.2.4.7. 通知顺序
6.2.5. 引入(Introduction)
6.2.6. 切面实例化模型
6.2.7. 例子
6.3. 基于Schema的AOP支持
6.3.1. 声明一个切面
6.3.2. 声明一个切入点
6.3.3. 声明通知
6.3.3.1. 前置通知
6.3.3.2. 后置通知
6.3.3.3. 异常通知
6.3.3.4. 最终通知
6.3.3.5. 环绕通知
6.3.3.6. 通知参数
6.3.3.7. 通知顺序
6.3.4. 引入
6.3.5. 切面实例化模型
6.3.6. Advisor
6.3.7. 例子
6.4. AOP声明风格的选择
6.4.1. Spring AOP还是完全用AspectJ?
6.4.2. Spring AOP中使用@AspectJ还是XML?
6.5. 混合切面类型
6.6. 代理机制
6.6.1. 理解AOP代理
6.7. 以编程方式创建@AspectJ代理
6.8. 在Spring应用中使用AspectJ
6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入
6.8.1.1. @Configurable对象的单元测试
6.8.1.2. Working with multiple application contexts
6.8.2. Spring中其他的AspectJ切面
6.8.3. 使用Spring IoC来配置AspectJ的切面
6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW)
6.8.4.1. 第一个例子
6.8.4.2. 切面
6.8.4.3. 'META-INF/aop.xml'
6.8.4.4. 相关类库(JARS)
6.8.4.5. Spring配置
6.8.4.6. 特定环境的配置
6.9. 更多资源
7. Spring AOP APIs
7.1. 简介
7.2. Spring中的切入点API
7.2.1. 概念
7.2.2. 切入点运算
7.2.3. AspectJ切入点表达式
7.2.4. 便利的切入点实现
7.2.4.1. 静态切入点
7.2.4.2. 动态切入点
7.2.5. 切入点的超类
7.2.6. 自定义切入点
7.3. Spring的通知API
7.3.1. 通知的生命周期
7.3.2. Spring里的通知类型
7.3.2.1. 拦截环绕通知
7.3.2.2. 前置通知
7.3.2.3. 异常通知
7.3.2.4. 后置通知
7.3.2.5. 引入通知
7.4. Spring里的Advisor API
7.5. 使用ProxyFactoryBean创建AOP代理
7.5.1. 基础
7.5.2. JavaBean属性
7.5.3. 基于JDK和CGLIB的代理
7.5.4. 对接口进行代理
7.5.5. 对类进行代理
7.5.6. 使用“全局”通知器
7.6. 简化代理定义
7.7. 使用ProxyFactory通过编程创建AOP代理
7.8. 操作被通知对象
7.9. 使用“自动代理(autoproxy)”功能
7.9.1. 自动代理bean定义
7.9.1.1. BeanNameAutoProxyCreator
7.9.1.2. DefaultAdvisorAutoProxyCreator
7.9.1.3. AbstractAdvisorAutoProxyCreator
7.9.2. 使用元数据驱动的自动代理
7.10. 使用TargetSource
7.10.1. 热交换目标源
7.10.2. 池化目标源
7.10.3. 原型目标源
7.10.4. ThreadLocal目标源
7.11. 定义新的Advice类型
7.12. 更多资源
8. 测试
8.1. 简介
8.2. 单元测试
8.2.1. Mock对象
8.2.1.1. JNDI
8.2.1.2. Servlet API
8.2.1.3. Portlet API
8.2.2. 单元测试支持类
8.2.2.1. 通用工具类
8.2.2.2. Spring MVC
8.3. 集成测试
8.3.1. 概览
8.3.2. 使用哪个支持框架
8.3.3. 通用目标
8.3.3.1. 上下文管理及缓存
8.3.3.2. 测试fixtures依赖注入
8.3.3.3. 事务管理
8.3.3.4. 集成测试支持类
8.3.4. JDBC测试支持
8.3.5. 常用注解
8.3.6. JUnit 3.8遗留支持
8.3.6.1. 上下文管理及缓存
8.3.6.2. 测试fixture依赖注入
8.3.6.3. 事务管理
8.3.6.4. JUnit 3.8 遗留支持类
8.3.6.5. Java 5+ 专有支持
8.3.7. Spring TestContext Framework
8.3.7.1. 主要的抽象
8.3.7.2. 上下文管理和缓存
8.3.7.3. 测试fixture的依赖注入
8.3.7.4. 事务管理
8.3.7.5. TestContext支持类
8.3.7.6. TestContext框架注解支持
8.3.8. PetClinic示例
8.4. 更多资源
II. 中间层数据访问
9. 事务管理
9.1. 简介
9.2. 动机
9.3. 关键抽象
9.4. 使用资源同步的事务
9.4.1. 高层次方案
9.4.2. 低层次方案
9.4.3. TransactionAwareDataSourceProxy
9.5. 声明式事务管理
9.5.1. 理解Spring的声明式事务管理实现
9.5.2. 第一个例子
9.5.3. 回滚
9.5.4. 为不同的bean配置不同的事务语义
9.5.5. <tx:advice/> 有关的设置
9.5.6. 使用 @Transactional
9.5.6.1. @Transactional 有关的设置
9.5.7. 事务传播
9.5.7.1. required
9.5.7.2. RequiresNew
9.5.7.3. Nested
9.5.8. 通知事务操作
9.5.9. 结合AspectJ使用 @Transactional
9.6. 编程式事务管理
9.6.1. 使用TransactionTemplate
9.6.1.1. 指定事务设置
9.6.2. 使用PlatformTransactionManager
9.7. 选择编程式事务管理还是声明式事务管理
9.8. 与特定应用服务器集成
9.8.1. IBM WebSphere
9.8.2. BEA WebLogic
9.8.3. Oracle OC4J
9.9. 常见问题的解决方法
9.9.1. 对一个特定的 DataSource 使用了错误的事务管理器
9.10. 更多的资源
10. DAO支持
10.1. 简介
10.2. 一致的异常层次
10.3. 一致的DAO支持抽象类
11. 使用JDBC进行数据访问
11.1. 简介
11.1.1. 选择一种工作模式
11.1.2. Spring JDBC包结构
11.2. 利用JDBC核心类控制JDBC的基本操作和错误处理
11.2.1. JdbcTemplate类
11.2.1.1. 一些示例
11.2.1.2. JdbcTemplate 的最佳实践
11.2.2. NamedParameterJdbcTemplate类
11.2.3. SimpleJdbcTemplate类
11.2.4. DataSource接口
11.2.5. SQLExceptionTranslator接口
11.2.6. 执行SQL语句
11.2.7. 执行查询
11.2.8. 更新数据库
11.2.9. 获取自动生成的主键
11.3. 控制数据库连接
11.3.1. DataSourceUtils类
11.3.2. SmartDataSource接口
11.3.3. AbstractDataSource类
11.3.4. SingleConnectionDataSource类
11.3.5. DriverManagerDataSource类
11.3.6. TransactionAwareDataSourceProxy类
11.3.7. DataSourceTransactionManager类
11.3.8. NativeJdbcExtractor
11.4. JDBC批量操作
11.4.1. 使用JdbcTemplate进行批量操作
11.4.2. 使用SimpleJdbcTemplate进行批量操作
11.5. 通过使用SimpleJdbc类简化JDBC操作
11.5.1. 使用SimpleJdbcInsert插入数据
11.5.2. 使用SimpleJdbcInsert来获取自动生成的主键
11.5.3. 指定SimpleJdbcInsert所使用的字段
11.5.4. 使用SqlParameterSource提供参数值
11.5.5. 使用SimpleJdbcCall调用存储过程
11.5.6. 声明SimpleJdbcCall使用的参数
11.5.7. 如何定义SqlParameters
11.5.8. 使用SimpleJdbcCall调用内置函数
11.5.9. 使用SimpleJdbcCall返回的ResultSet/REF Cursor
11.6. 用Java对象来表达JDBC操作
11.6.1. SqlQuery类
11.6.2. MappingSqlQuery类
11.6.3. SqlUpdate类
11.6.4. StoredProcedure类
11.6.5. SqlFunction类
11.7. 参数和数据处理的基本原则
11.7.1. 为参数设置SQL类型信息
11.7.2. 处理BLOB 和 CLOB对象
11.7.3. 在IN语句中传入一组参数值
11.7.4. 处理复杂类型的存储过程调用
12. 使用ORM工具进行数据访问
12.1. 简介
12.2. Hibernate
12.2.1. 资源管理
12.2.2. 在Spring容器中创建 SessionFactory
12.2.3. The HibernateTemplate
12.2.4. 不使用回调的基于Spring的DAO实现
12.2.5. 基于Hibernate3的原生API实现DAO
12.2.6. 编程式的事务划分
12.2.7. 声明式的事务划分
12.2.8. 事务管理策略
12.2.9. 容器资源 vs 本地资源
12.2.10. 在应用服务器中使用Hibernate的注意事项
12.3. JDO
12.3.1. 建立PersistenceManagerFactory
12.3.2. JdoTemplate和JdoDaoSupport
12.3.3. 基于原生的JDO API实现DAO
12.3.4. 事务管理
12.3.5. JdoDialect
12.4. Oracle TopLink
12.4.1. SessionFactory 抽象层
12.4.2. TopLinkTemplate and TopLinkDaoSupport
12.4.3. 基于原生的TopLink API的DAO实现
12.4.4. 事务管理
12.5. iBATIS SQL Maps
12.5.1. 创建SqlMapClient
12.5.2. 使用 SqlMapClientTemplate 和 SqlMapClientDaoSupport
12.5.3. 基于原生的iBATIS API的DAO实现
12.6. JPA
12.6.1. 在Spring环境中建立JPA
12.6.1.1. LocalEntityManagerFactoryBean
12.6.1.2. 从JNDI中获取 EntityManagerFactory
12.6.1.3. LocalContainerEntityManagerFactoryBean
12.6.1.4. 处理多持久化单元
12.6.2. JpaTemplate 和 JpaDaoSupport
12.6.3. 基于原生的JPA实现DAO
12.6.4. 异常转化
12.7. 事务管理
12.8. JpaDialect
III. The Web
13. Web MVC framework Web框架
13.1. 概述
13.1.1. 与其他MVC实现框架的集成
13.1.2. Spring Web MVC框架的特点
13.2. DispatcherServlet
13.3. 控制器
13.3.1. AbstractController 和 WebContentGenerator
13.3.2. 其它的简单控制器
13.3.3. MultiActionController
13.3.4. 命令控制器
13.4. 处理器映射(handler mapping)
13.4.1. BeanNameUrlHandlerMapping
13.4.2. SimpleUrlHandlerMapping
13.4.3. 拦截器(HandlerInterceptor)
13.5. 视图与视图解析
13.5.1. 视图解析器(ViewResolver)
13.5.2. 视图解析链
13.5.3. 重定向(Rediret)到另一个视图
13.5.3.1. RedirectView
13.5.3.2. redirect:前缀
13.5.3.3. forward:前缀
13.6. 本地化解析器
13.6.1. AcceptHeaderLocaleResolver
13.6.2. CookieLocaleResolver
13.6.3. SessionLocaleResolver
13.6.4. LocaleChangeInterceptor
13.7. 使用主题
13.7.1. 简介
13.7.2. 如何定义主题
13.7.3. 主题解析器
13.8. Spring对分段文件上传(multipart file upload)的支持
13.8.1. 介绍
13.8.2. 使用MultipartResolver
13.8.3. 在表单中处理分段文件上传
13.9. 使用Spring的表单标签库
13.9.1. 配置
13.9.2. form标签
13.9.3. input标签
13.9.4. checkbox标签
13.9.5. checkboxes标签
13.9.6. radiobutton标签
13.9.7. radiobuttons标签
13.9.8. password标签
13.9.9. select标签
13.9.10. option标签
13.9.11. options标签
13.9.12. textarea标签
13.9.13. hidden标签
13.9.14. errors标签
13.10. 处理异常
13.11. 惯例优先原则(convention over configuration)
13.11.1. 对控制器的支持:ControllerClassNameHandlerMapping
13.11.2. 对模型的支持:ModelMap(ModelAndView)
13.11.3. 对视图的支持:RequestToViewNameTranslator
13.12. 基于注解的控制器配置
13.12.1. 建立dispatcher实现注解支持
13.12.2. 使用@Controller定义一个控制器
13.12.3. 使用@RequestMapping映射请求
13.12.4. 使用@RequestParam绑定请求参数到方法参数
13.12.5. 使用@ModelAttribute提供一个从模型到数据的链接
13.12.6. 使用@SessionAttributes指定存储在会话中的属性
13.12.7. 自定义WebDataBinder初始化
13.12.7.1. 使用@InitBinder自定义数据绑定
13.12.7.2. 配置一个定制的WebBindingInitializer
13.13. 更多资源
14. 集成视图技术
14.1. 简介
14.2. JSP和JSTL
14.2.1. 视图解析器
14.2.2. 'Plain-old' JSPs versus JSTL 'Plain-old' JSP与JSTL
14.2.3. 帮助简化开发的额外的标签
14.3. Tiles
14.3.1. 需要的资源
14.3.2. 如何集成Tiles
14.3.2.1. UrlBasedViewResolver类
14.3.2.2. ResourceBundleViewResolver类
14.3.2.3. SimpleSpringPreparerFactory 和 SpringBeanPreparerFactory
14.4. Velocity和FreeMarker
14.4.1. 需要的资源
14.4.2. Context 配置
14.4.3. 创建模板
14.4.4. 高级配置
14.4.4.1. velocity.properties
14.4.4.2. FreeMarker
14.4.5. 绑定支持和表单处理
14.4.5.1. 用于绑定的宏
14.4.5.2. 简单绑定
14.4.5.3. 表单输入生成宏
14.4.5.4. 重载HTML转码行为并使你的标签符合XHTML
14.5. XSLT
14.5.1. 写在段首
14.5.1.1. Bean 定义
14.5.1.2. 标准MVC控制器代码
14.5.1.3. 把模型数据转化为XML
14.5.1.4. 定义视图属性
14.5.1.5. 文档转换
14.5.2. 小结
14.6. 文档视图(PDF/Excel)
14.6.1. 简介
14.6.2. 配置和安装
14.6.2.1. 文档视图定义
14.6.2.2. Controller 代码
14.6.2.3. Excel视图子类
14.6.2.4. PDF视图子类
14.7. JasperReports
14.7.1. 依赖的资源
14.7.2. 配置
14.7.2.1. 配置ViewResolver
14.7.2.2. 配置View
14.7.2.3. 关于报表文件
14.7.2.4. 使用 JasperReportsMultiFormatView
14.7.3. 构造ModelAndView
14.7.4. 使用子报表
14.7.4.1. 配置子报表文件
14.7.4.2. 配置子报表数据源
14.7.5. 配置Exporter的参数
15. 集成其它Web框架
15.1. 简介
15.2. 通用配置
15.3. JavaServer Faces
15.3.1. DelegatingVariableResolver
15.3.2. FacesContextUtils
15.4. Struts
15.4.1. ContextLoaderPlugin
15.4.1.1. DelegatingRequestProcessor
15.4.1.2. DelegatingActionProxy
15.4.2. ActionSupport Classes
15.5. Tapestry
15.5.1. 注入 Spring 托管的 beans
15.5.1.1. 将 Spring Beans 注入到 Tapestry 页面中
15.5.1.2. 组件定义文件
15.5.1.3. 添加抽象访问方法
15.5.1.4. 将 Spring Beans 注入到 Tapestry 页面中 - Tapestry 4.0+ 风格
15.6. WebWork
15.7. 更多资源
16. Portlet MVC框架
16.1. 介绍
16.1.1. 控制器 - MVC中的C
16.1.2. 视图 - MVC中的V
16.1.3. Web作用范围的Bean
16.2. DispatcherPortlet
16.3. ViewRendererServlet
16.4. 控制器
16.4.1. AbstractController 和 PortletContentGenerator
16.4.2. 其它简单的控制器
16.4.3. Command控制器
16.4.4. PortletWrappingController
16.5. 处理器映射
16.5.1. PortletModeHandlerMapping
16.5.2. ParameterHandlerMapping
16.5.3. PortletModeParameterHandlerMapping
16.5.4. 增加 HandlerInterceptors
16.5.5. HandlerInterceptorAdapter
16.5.6. ParameterMappingInterceptor
16.6. 视图和它们的解析
16.7. Multipart文件上传支持
16.7.1. 使用 PortletMultipartResolver
16.7.2. 处理表单里的文件上传
16.8. 异常处理
16.9. Portlet应用的部署
IV. 整合
17. 使用Spring进行远程访问与Web服务
17.1. 简介
17.2. 使用RMI暴露服务
17.2.1. 使用RmiServiceExporter暴露服务
17.2.2. 在客户端链接服务
17.3. 使用Hessian或者Burlap通过HTTP远程调用服务
17.3.1. 为Hessian和co.配置DispatcherServlet
17.3.2. 使用HessianServiceExporter暴露你的bean
17.3.3. 在客户端连接服务
17.3.4. 使用Burlap
17.3.5. 对通过Hessian或Burlap暴露的服务使用HTTP Basic认证
17.4. 使用HTTP调用器暴露服务
17.4.1. Exposing the service object
17.4.2. 在客户端连接服务
17.5. Web Services
17.5.1. 使用JAX-RPC暴露基于servlet的web服务
17.5.2. 使用JAX-RPC访问web服务
17.5.3. 注册JAX-RPC Bean映射
17.5.4. 注册自己的JAX-RPC 处理器
17.5.5. 使用JAX-WS暴露基于servlet的web服务
17.5.6. 使用JAX-WS暴露单独web服务
17.5.7. 使用Spring支持的JAX-WS RI来暴露服务
17.5.8. 使用JAX-WS访问web服务
17.5.9. 使用XFire来暴露Web服务
17.6. JMS
17.6.1. 服务端配置
17.6.2. 客户端配置
17.7. 对远程接口不提供自动探测实现
17.8. 在选择这些技术时的一些考虑
18. Enterprise Java Beans (EJB) 集成
18.1. 简介
18.2. 访问EJB
18.2.1. 概念
18.2.2. 访问本地的无状态Session Bean(SLSB)
18.2.3. 访问远程SLSB
18.2.4. Accessing EJB 2.x SLSBs versus EJB 3 SLSBs
18.3. 使用Spring提供的辅助类实现EJB组件
18.3.1. EJB 2.x base classes
18.3.2. EJB 3 注入拦截
19. JMS (Java Message Service)
19.1. 简介
19.2. 使用Spring JMS
19.2.1. JmsTemplate
19.2.2. 连接工厂
19.2.3. 目的地管理
19.2.4. 消息侦听容器
19.2.4.1. SimpleMessageListenerContainer
19.2.4.2. DefaultMessageListenerContainer
19.2.4.3. ServerSessionMessageListenerContainer
19.2.5. 事务管理
19.3. 发送消息
19.3.1. 使用消息转换器
19.3.2. SessionCallback 和 ProducerCallback
19.4. 接收消息
19.4.1. 同步接收
19.4.2. 异步接收 - 消息驱动的POJO
19.4.3. SessionAwareMessageListener接口
19.4.4. MessageListenerAdapter
19.4.5. 事务中的消息处理
19.5. JCA消息端点的支持
19.6. JMS命名空间支持
20. JMX
20.1. 介绍
20.2. 将Bean暴露为JMX
20.2.1. 创建MBeanServer
20.2.2. 重用原有的MBeanServer
20.2.3. 延迟初始化的MBean
20.2.4. MBean的自动注册
20.2.5. 控制注册行为
20.3. 控制Bean的管理接口
20.3.1. MBeanInfoAssembler接口
20.3.2. 使用源码级元数据
20.3.3. 使用JDK 5.0的注解
20.3.4. 源代码级的元数据类型
20.3.5. AutodetectCapableMBeanInfoAssembler接口
20.3.6. 用Java接口定义管理接口
20.3.7. 使用MethodNameBasedMBeanInfoAssembler
20.4. 控制Bean的ObjectName
20.4.1. 从Properties读取Properties
20.4.2. 使用MetadataNamingStrategy
20.4.3. <context:mbean-export/>元素
20.5. JSR-160连接器
20.5.1. 服务器端连接器
20.5.2. 客户端连接器
20.5.3. 基于Burlap/Hessian/SOAP的JMX
20.6. 通过代理访问MBean
20.7. 通知
20.7.1. 为通知注册监听器
20.7.2. 发布通知
20.8. 更多资源
21. JCA CCI
21.1. 简介
21.2. 配置CCI
21.2.1. 连接器配置
21.2.2. 在Spring中配置ConnectionFactory
21.2.3. 配置CCI连接
21.2.4. 使用一个 CCI 单连接
21.3. 使用Spring的 CCI访问支持
21.3.1. 记录转换
21.3.2. CciTemplate类
21.3.3. DAO支持
21.3.4. 自动输出记录生成
21.3.5. 总结
21.3.6. 直接使用一个CCI Connection接口和Interaction接口
21.3.7. CciTemplate 使用示例
21.4. 建模CCI访问为操作对象
21.4.1. MappingRecordOperation
21.4.2. MappingCommAreaOperation
21.4.3. 自动生成输出记录
21.4.4. 总结
21.4.5. MappingRecordOperation 使用示例
21.4.6. MappingCommAreaOperation 使用示例
21.5. 事务
22. Spring邮件抽象层
22.1. 简介
22.2. 使用Spring邮件抽象
22.2.1. MailSender 和 SimpleMailMessage 的基本用法
22.2.2. 使用 JavaMailSender 和 MimeMessagePreparator
22.3. 使用MimeMessageHelper
22.3.1. 发送附件和嵌入式资源(inline resources)
22.3.1.1. 附件
22.3.1.2. 内嵌资源
22.3.2. 使用模板来创建邮件内容
22.3.2.1. 一个基于Velocity的示例
23. Spring中的定时调度(Scheduling)和线程池(Thread Pooling)
23.1. 简介
23.2. 使用OpenSymphony Quartz 调度器
23.2.1. 使用JobDetailBean
23.2.2. 使用 MethodInvokingJobDetailFactoryBean
23.2.3. 使用triggers和SchedulerFactoryBean来包装任务
23.3. 使用JDK Timer支持类
23.3.1. 创建定制的timers
23.3.2. 使用 MethodInvokingTimerTaskFactoryBean类
23.3.3. 最后:使用TimerFactoryBean来设置任务
23.4. SpringTaskExecutor抽象
23.4.1. TaskExecutor接口
23.4.2. TaskExecutor类型
23.4.3. 使用TaskExecutor
24. 动态语言支持
24.1. 介绍
24.2. 第一个示例
24.3. 定义动态语言支持的bean
24.3.1. 公共概念
24.3.1.1. <lang:language/> 元素
24.3.1.2. Refreshable bean
24.3.1.3. 内置动态语言源文件
24.3.1.4. 理解dynamic-language-backed bean上下文中的构造器注入
24.3.2. JRuby beans
24.3.3. Groovy beans
24.3.3.1. 通过回调定制Groovy对象
24.3.4. BeanShell beans
24.4. 场景
24.4.1. Spring MVC控制器的脚本化
24.4.2. Validator的脚本化
24.5. Bits and bobs
24.5.1. AOP - 通知脚本化bean
24.5.2. 作用域
24.6. 更多的资源
25. 注解和源代码级的元数据支持
25.1. 简介
25.2. Spring的元数据支持
25.3. 注解
25.3.1. @Required
25.3.2. Spring中的其它@Annotations
25.4. Jakarta Commons Attributes集成
25.5. 元数据和Spring AOP自动代理
25.5.1. 基本原理
25.5.2. 声明式事务管理
V. 示例程序
26. 演示案例
26.1. 介绍
26.2. 使用动态语言实现的Spring MVC控制器
26.2.1. 构建与部署
26.3. 使用SimpleJdbcTemplate和@Repository实现DAO
26.3.1. 域对象
26.3.2. Data Access Object
26.3.3. 构建
A. XML Schema-based configuration
A.1. Introduction
A.2. XML Schema-based configuration
A.2.1. Referencing the schemas
A.2.2. The util schema
A.2.2.1. <util:constant/>
A.2.2.2. <util:property-path/>
A.2.2.3. <util:properties/>
A.2.2.4. <util:list/>
A.2.2.5. <util:map/>
A.2.2.6. <util:set/>
A.2.3. The jee schema
A.2.3.1. <jee:jndi-lookup/> (simple)
A.2.3.2. <jee:jndi-lookup/> (with single JNDI environment setting)
A.2.3.3. <jee:jndi-lookup/> (with multiple JNDI environment settings)
A.2.3.4. <jee:jndi-lookup/> (complex)
A.2.3.5. <jee:local-slsb/> (simple)
A.2.3.6. <jee:local-slsb/> (complex)
A.2.3.7. <jee:remote-slsb/>
A.2.4. The lang schema
A.2.5. The jms schema
A.2.6. The tx (transaction) schema
A.2.7. The aop schema
A.2.8. The context schema
A.2.8.1. <property-placeholder/>
A.2.8.2. <annotation-config/>
A.2.8.3. <component-scan/>
A.2.8.4. <load-time-weaver/>
A.2.8.5. <spring-configured/>
A.2.8.6. <mbean-export/>
A.2.9. The tool schema
A.2.10. The beans schema
A.3. Setting up your IDE
A.3.1. Setting up Eclipse
A.3.2. Setting up IntelliJ IDEA
A.3.3. Integration issues
A.3.3.1. XML parsing errors in the Resin v.3 application server
B. Extensible XML authoring
B.1. Introduction
B.2. Authoring the schema
B.3. Coding a NamespaceHandler
B.4. Coding a BeanDefinitionParser
B.5. Registering the handler and the schema
B.5.1. 'META-INF/spring.handlers'
B.5.2. 'META-INF/spring.schemas'
B.6. Using a custom extension in your Spring XML configuration
B.7. Meatier examples
B.7.1. Nesting custom tags within custom tags
B.7.2. Custom attributes on 'normal' elements
B.8. Further Resources
C. spring-beans-2.0.dtd
D. spring.tld
D.1. Introduction
D.2. The bind tag
D.3. The escapeBody tag
D.4. The hasBindErrors tag
D.5. The htmlEscape tag
D.6. The message tag
D.7. The nestedPath tag
D.8. The theme tag
D.9. The transform tag
E. spring-form.tld
E.1. Introduction
E.2. The checkbox tag
E.3. The checkboxes tag
E.4. The errors tag
E.5. The form tag
E.6. The hidden tag
E.7. The input tag
E.8. The label tag
E.9. The option tag
E.10. The options tag
E.11. The password tag
E.12. The radiobutton tag
E.13. The radiobuttons tag
E.14. The select tag
E.15. The textarea tag
F. Spring 2.5开发手册中文化项目
F.1. 声明
F.2. 致谢
F.3. 参与人员
F.4. 项目历程

前言

即使有好工具和好技术,开发软件仍然是比较困难的。有一些平台,它们包打天下, 但实际上很沉重、难以控制,在开发过程中效率不高,却让开发软件变得更加困难。 Spring为编写企业应用程序提供了轻量的解决方案,同时仍然支持使用声明式事务、 用RMI或web service远程调用、以及使用多种方式来将数据持久化到数据库。Spring提供了全功能的 MVC framework, 以及透明集成AOP到你的软件中的能力。

Spring可能是你的企业应用程序所需要的一站式解决方案, 但Spring仍然是模块化的,允许你只使用你所需的哪些部分,而无需附加上其他部分。 你可以使用 IoC容器,在其上使用Struts,但是你也可以选择使用 Hibernate 整合代码或者 JDBC 抽象层。 我们将Spring设计为非侵入式的(并且以后也是如此),这意味着应用基本上不需要依赖框架本身 (或者肯定是最小的,取决于所使用的部分)。

这份手册提供Spring的功能参考指南。由于本文档也需要大量的工作,如果你有任何要求或者意见, 请发送到用户邮件列表,或者提交到http://forum.springframework.org/支持论坛。

另外,必须感谢Christian Bauer(来自Hibernate团队) ,他改写了DocBook-XSL软件来创建Hibernate参考手册,我们才得以创建这份文档。 也需要感谢Russell Healy为本手册的部分内容进行的详细而极富价值的审核。

Chapter 1. 简介

Java应用(从applets的小范围到全套n层服务端企业应用)是一种典型的依赖型应用,它就是由一些互相适当地协作的对象构成的。因此,我们说这些对象间存在依赖关系

Java语言和java平台在架构应用与建立应用方面,提供着丰富的功能。从非常基础的基本数据类型和Class(即定义新类)组成的程序块,到建立具有丰富的特性的应用服务器和web框架都有着很多的方法。一方面,可以通过抽象的显著特性让基础的程序块组成在一起成为一个连贯的整体。这样,构建一个应用(或者多个应用)的工作就可以交给架构师或者开发人员去做。因此,我们就可以清晰的知道哪些业务需要哪些Classes和对象组成,哪些设计模式可以应用在哪些业务上面。 例如:FactoryAbstract FactoryBuilderDecoratorService Locator 这些模式(列举的只是少数)在软件开发行业被普遍认可和肯定(或许这就是为什么这些模式被定型的原因)。 这固然是件好事,不过这些模式只是一个有名字的,有说明的,知道最好用在什么地方的,解决应用中什么问题的最佳实践而已。 在本章节的最后,用“... 说明 ...”给出了模式说明。 通常,模式书籍与wikis通常都列出了你可以获得的最佳实践,不过,希望你思考之后,在你自己的应用中 实现自己的模式

Spring的IoC控件主要专注于如何利用classes、对象和服务去组成一个企业级应用,通过规范的方式,将各种不同的控件整合成一个完整的应用。Spring中使用了很多被实践证明的最佳实践和正规的设计模式,并且进行了编码实现。如果你是一个,构架师或者开发人员完全可以取出它们集成到你自己的应用之中。这对于那些使用了Spring Framework的组织和机构来说,在spring基础上实现应用不仅可以构建优秀的,可维护的应用并对Spring的设计进行验证,确实是一件好事情

1.1. 概览

Spring框架包含许多特性,并被很好地组织在下图所示的六个模块中。本节将依次介绍每个模块。

Spring框架概述

Core 封装包是框架的最基础部分,提供IoC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。

Context(上下文) 封装包构筑于Core封装包的坚固基础上:它提供了用一种框架风格的方式来访问对象,有些像JNDI注册表。Context封装包继承了beans包的功能,还增加了国际化(I18N)(用于规范resource bundle),事件传播,资源装载,以及透明创建上下文,例如通过servlet容器。

DAO 提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码。 并且,JDBC 封装包还提供了一种比编程性更好的声明性事务管理方法,不仅仅是实现了特定接口,而且对所有的POJOs(plain old Java objects)都适用。

ORM 封装包提供了常用的“对象/关系”映射APIs的集成层。 其中包括JPAJDOHibernateiBatis 。利用ORM封装包,可以混合使用所有Spring提供的特性进行“对象/关系”映射,如前边提到的简单声明性事务管理。

Spring的 AOP 封装包提供了符合 AOP Alliance规范的面向方面的编程(aspect-oriented programming)实现,让你可以定义,例如方法拦截器(method-interceptors)和切点(pointcuts),从逻辑上讲,从而减弱代码的功能耦合,清晰的被分离开。而且,利用source-level的元数据功能,还可以将各种行为信息合并到你的代码中,这有点象.Net的attribute的概念。

Spring中的 Web 包提供了基础的针对Web开发的集成特性,例如多方文件上传,利用Servlet listeners进行IoC容器初始化和针对Web的application context。当与WebWork或Struts一起使用Spring时,这个包使Spring可与其他框架结合。

Spring中的 MVC 封装包提供了Web应用的Model-View-Controller(MVC)实现。Spring的MVC框架并不是仅仅提供一种传统的实现,它提供了一种 清晰的 分离模型,在领域模型代码和web form之间。并且,还可以借助Spring框架的其他特性。

1.1.1. 使用场景

借助搭积木方式来解释一下各种情景下使用Spring的情况,从简单的Applet一直到完整的使用Spring的事务管理功能和Web框架的企业应用。

典型的完整Spring Web应用

通过用Spring的 声明事务管理特性,Web应用可以做到完全事务性,就像使用EJB提供的那种容器管理的事务一样。 所有自定义的业务逻辑可以通过简单的POJO来实现,并利用Spring的IoC容器进行管理。对于其他的服务,比如发送email和不依赖web层的校验信息,还可以让你自己决定在哪里执行校验规则。 Spring本身的ORM支持可以和JPA、Hibernate、JDO以及iBatis集成起来,例如使用Hibernate,你可复用已经存在的映射文件与标准的Hibernate SessionFactory 配置。用控制器去无缝整合web层和领域模型,消除对 ActionForms 的依赖,或者避免了其他class为领域模型转换HTTP参数的需要。

使用了第三方框架的Spring中间层

有的时候,现有情况不允许你彻底地从一种框架切换到另一种框架。然而,Spring却 不需要 强制你使用它的全部,Spring不是一种 全有全无 的解决方案。 如果,现有的应用使用了WebWork、Struts、Tapestry或其他的UI框架作为前端程序,完全可以只与Spring的事务特性进行集成。 只需要使用 ApplicationContext 来挂接你的业务逻辑和通过 WebApplicationContext 来集成你的web层前端程序。

远程使用场景

当你需要通过WebService来访问你的现有代码时,你可使用Spring提供的 Hessian-Burlap-Rmi- 为前缀的接口或者 JaxRpcProxyFactory 这个代理类。你会发现,远程访问现有应用程序不再那么困难了。

EJBs-包装现有的POJOs

Spring还为EJB提供了 数据访问和抽象层,让你可以复用已存在的POJO并将他们包装在无状态SessionBean中,以便在可能需要声明式安全(EJB中的安全管理,译者注)的非安全的Web应用中使用。

Chapter 2. Spring 2.0和 2.5的新特性

2.1. 简介

如果你已经用了一段时间的Spring Framework,那你将发现Spring经历了两次大的修订: 一次是2006年10月发布的Spring 2.0, 另一次是2007年11月发布 Spring 2.5 。

本章是对Spring 2.0与2.5新特性与改进特性的向导。我们希望提供一个高阶的概述使那些有经验的Spring架构师与开发人员能很快熟悉Spring 2.x的新功能。 如果想了解关于特性更多更深层的信息,请参考在本章里超链接的相应部分。

2.2. 控制反转(IoC)容器

Spring 2.0 相当大的改进之一就是Spring的IoC容器。

2.2.1. 新的bean作用域

Spring上个版本的IoC容器支持两个不同的bean作用域(单例与原型)。Spring 2.0改进了这一点,不仅提供了一些依赖于Spring部署环境(比如说,在web环境中的request和session作用域bean)的额外的作用域,而且提供了所谓的'钩子'('hooks')(因为找不到更好的表达)使Spring用户可以创造自己的作用域。

应该注意的是,即使单例与原型作用域beans的基本(内在)实现发生了变化,上述变化对最终用户来说是透明的...现有的配置不需要改变或放弃。

在标题为 Section 3.4, “Bean的作用域” 的部分有对新增的作用域与原有作用域的详细描述。

2.2.2. 更简单的XML配置

多亏了新的基于XML Schema的XML配置语法的产生,Spring的XML配置变的更加简单了。如果你想充分利用Spring提供的新标签(Spring团队当然建议你这么做,因为他们使配置变的不再繁琐,更加易于阅读),请阅读标题为 Appendix A, XML Schema-based configuration 的部分。

相关提示,有一个新的更新过的Spring 2.0的DTD。如果你不能使用基于Schema的XML配置,你可以使用它。下面给出了DOCTYPE声明,如果有兴趣的读者可以详细阅读Spring 2.0发布包的 'dist/resources'目录中的'spring-beans-2.0.dtd' DTD。

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
			  "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

2.2.3. 可扩展的XML编写

XML配置不仅更加易于书写,而且也具有可扩展性。

这里'可扩展性'的含义是,作为一个应用程序开发人员,或着(更可能)作为第三方框架或产品的供应商,可以开发自定义标签,供其他开发人员把这些标签嵌入到自己的Spring配置文件里。你可以在组件的特定配置中定义你自己的DSL(domain specific language,这个词在这里用得比较宽泛)。

对于开发人员或者在项目中运用Spring的企业架构师来说,实现自定义Spring标签可能不是每个人都感兴趣的。我们期待着第三方供应商能够对开发在Spring配置文件里使用的自定义配置标签予于足够的关注。

可扩展的配置机制在 Appendix B, Extensible XML authoring 里有更充分的描述。

2.2.4. Annotation(注解)驱动配置

Spring 2.0 引入了一些用于配置的annotation, 包括 @Transactional, @Required and @PersistenceContext /@PersistenceUnit.

Spring 2.5 引入了用于配置的完整的Annotation集合: @Autowired,以及对JSR-250注解@Resource, @PostConstruct and @PreDestroy的支持。

Annotation驱动的bean 配置在Section 3.11, “基于注解(Annotation-based)的配置”中讨论。也请查阅对Spring MVC的annotation的支持Section 2.5.3, “基于Annotation的控制器”

2.2.5. 在classpath中自动搜索组件

Spring2.5 引入了组件搜索功能:在classpath中自动搜索带有annotation的组件。典型的,下列组件类会注解为stereotype: @Component, @Repository, @Service, @Controller. 取决于程序的上下文配置,这些组件会被自动搜索到,并且转变为Spring bean定义,而不需要为每个类都进行明确的配置。

Annotation-driven bean configuration is discussed in Section 3.12.1, “@Component和更多典型化注解”.

Annotation驱动的bean配置在Section 3.12.1, “@Component和更多典型化注解”讨论。

2.3. 面向切面编程(AOP)

Spring 2.0在AOP上有很大的改进。Spring AOP框架本身就十分易于用XML配置,不再那么繁琐;Spring 2.0集成了AspectJ 切入点(pointcut)语言和 @AspectJ 切面(aspect)声明类型。 标题为 Chapter 6, 使用Spring进行面向切面编程(AOP) 的部分专门描述这个新支