译者序 1
前言 1
作者简介 1
致谢 1
第1章 Spring框架概述 1
1.1 为什么要Spring 1
1.1.1 J2EE传统方式的问题 1
1.1.2 轻量级框架 3
1.1.3 进入Spring 3
1.2 Spring的价值 4
1.3 上下文中的Spring 6
1.3.1 技术 6
1.3.2 技巧 12
1.3.3 与其他框架的关系 13
1.4 使用Spring构造应用程序 15
1.4.1 结构层次图 15
1.4.2 持久性和集成 17
1.4.3 业务服务对象 19
1.4.4 表示 19
1.5 前景 21
1.5.1 发布日程 21
1.5.2 Java和J2EE的进展 21
1.5.3 技术趋势 22
1.5.4 标准与源码公开 22
1.6 Spring项目和社区 23
1.6.1 历史 23
1.6.2 模块摘要 24
1.6.3 支持的环境 26
1.7 小结 27
第2章 Bean工厂与应用程序上下文 28
2.1 控制反转和依赖注入 28
2.1.1 不同形式的依赖注入 31
2.1.2 在设置器注入和构造函数注入之间决定 33
2.2 容器 34
2.2.1 Bean工厂 34
2.2.2 应用程序上下文 35
2.2.3 启动容器 36
2.2.4 使用来自工厂的Bean 38
2.2.5 XML Bean配置 38
2.2.6 基本的Bean定义 39
2.2.7 指定Bean的依赖 41
2.2.8 管理Bean生命周期 47
2.2.9 对服务和资源访问的抽象 49
2.2.10 重用Bean定义 53
2.2.11 使用后置处理器处理定制的Bean和容器 55
2.3 小结 60
第3章 高级容器概念 62
3.1 低层资源的抽象 62
3.1.1 应用程序上下文作为ResourceLoader 63
3.1.2 应用程序上下文作为消息源 65
3.2 应用程序事件 66
3.3 管理容器 68
3.3.1 ApplicationContext构造函数中的资源位置路径 68
3.3.2 应用程序上下文的声明式用法 69
3.3.3 将容器定义划分到多个文件 71
3.3.4 处理组件的策略 72
3.3.5 用于访问容器的单态 74
3.4 一些方便的工厂Bean 74
3.4.1 PropertyPathFactoryBean 75
3.4.2 FieldRetrievingFactoryBean 76
3.4.3 MethodInvokingFactoryBean 76
3.5 Spring提供的属性编辑器 77
3.6 测试策略 77
3.6.1 单元测试 77
3.6.2 使用Spring容器的测试 80
3.7 XML的替代品 82
3.7.1 来自Properties文件的定义 82
3.7.3 其他格式 83
3.7.2 编程式Bean定义 83
3.8 参考文献 84
3.9 小结 84
第4章 Spring与AOP 85
4.1 目标 85
4.2 假设 86
4.3 例子 86
4.4 Spring的AOP框架 89
4.4.1 拦截器链 89
4.4.2 赞成与反对 89
4.4.3 通知 90
4.4.4 切点 94
4.4.5 通知器(advisor) 98
4.4.6 与Spring IoC容器的集成 99
4.4.8 编程式的代理创建 109
4.4.7 在运行时间检验并处理代理状态 109
4.5 使用Spring的AOP框架的高级特性 110
4.5.1 TargetSources 110
4.5.2 及早终止拦截器链 115
4.5.3 使用介绍 115
4.5.4 暴露当前的代理 117
4.5.5 暴露当前的MethodInvocation 117
4.5.6 理解代理类型 118
4.5.7 调试与测试 119
4.5.8 其他 121
4.6 与其他AOP框架集成 123
4.6.1 目标 123
4.6.2 集成AspectJ 123
4.6.3 AspectWerkz 126
4.7 参考文献 127
4.8 小结 127
第5章 DAO支持与JDBC框架 128
5.1 数据访问对象模式 128
5.2 Spring的JDBC框架概述 129
5.2.1 起因:直接使用JDBC的问题 130
5.2.2 Spring可以如何帮助 131
5.2.3 简单的例子 131
5.3 建立样本应用程序的数据访问层 132
5.3.1 样本应用程序的数据模型 132
5.3.2 DataSource 134
5.3.3 异常转译 135
5.4.1 回调方法的使用 137
5.4 使用JdbcTemplate的操作 137
5.4.2 JdbcTemplate的方便方法 138
5.4.3 使用JdbcTemplate的基本查询 138
5.4.4 使用JdbcTemplate的基本更新 139
5.4.5 JdbcTemplate的高级用法 140
5.4.6 对RowSet的支持 141
5.5 使用RDBMS操作类 142
5.5.1 SqlQuery和MappingSqlQuery 142
5.5.2 使用SqlUpdate插入和更新 144
5.5.3 使用UpdatableSqlQuery更新ResultSet 145
5.5.4 生成主键 146
5.5.5 检索数据库生成的键 147
5.5.6 调用存储过程 148
5.6 高级概念 150
5.6.1 在应用程序服务器中运行Spring JDBC 150
5.6.2 使用定制的异常转译 151
5.6.3 读写LOB数据 153
5.6.4 批量更新 158
5.6.5 存储过程的高级用法 159
5.7 其他的考虑事项 163
5.7.1 性能 163
5.7.2 何时使用JDBC和O/R映射 163
5.7.3 JDBC版本和J2EE版本 163
5.8 小结 164
6.1.1 什么是事务 165
6.1.2 ACID属性 165
6.1 背景 165
第6章 事务和资源管理 165
6.1.3 并发控制 167
6.2 事务与J2EE 167
6.2.1 局部事务 167
6.2.2 全局/分布式事务 167
6.2.3 事务传播 168
6.2.4 事务划分 168
6.3 Spring事务支持的例子 168
6.4 Spring的事务抽象介绍 170
6.4.1 事务控制选择的概述 170
6.4.2 事务定义 171
6.4.3 事物状态 174
6.4.4 事务划分策略 174
6.4.5 事物管理策略 185
6.5 DataSource声明 192
6.5.1 本地非缓冲 192
6.5.2 本地缓冲 193
6.5.3 JNDI 193
6.5.4 在本地DataSource和JNDI DataSource之间选择 194
6.6 小结 194
第7章 对象/关系映射 195
7.1 背景知识 195
7.1.1 基本的O/R映射 195
7.1.2 对象查询语言 196
7.1.3 透明持久性 196
7.1.4 何时选择O/R映射 197
7.2 Spring中的O/R映射支持 197
7.2.2 事务管理 198
7.2.1 数据访问对象 198
7.3 iBATIS SQL Maps 199
7.3.1 映射文件 199
7.3.2 DAO实现 201
7.3.3 在Spring上下文中设置 202
7.3.4 事务管理 203
7.3.5 iBATIS概要 204
7.4 Hibernate 205
7.4.1 映射文件 205
7.4.2 DAO实现 206
7.4.3 Spring上下文中的设置 209
7.4.4 事务管理 211
7.4.5 Open Session in View 216
7.4.6 BLOB/CLOB处理 218
7.4.7 Hibernate:小结 220
7.5 JDO 221
7.5.1 持久性对象的生命周期 221
7.5.2 DAO实现 222
7.5.3 在Spring上下文中设置 223
7.5.4 事务管理 224
7.5.5 PersistenceManager的生命周期 225
7.5.6 Open PersistenceManager in View 226
7.5.7 JDO方言 227
7.5.8 JDO:小结 228
7.6 其他O/R映射工具 229
7.6.1 Apache OJB 229
7.6.2 TopLink 230
7.7 小结 231
7.6.3 Cayenne 231
7.6.4 JSR-220持久性 231
第8章 轻量级远程处理 233
8.1 概念和范围 233
8.2 一般的配置风格 234
8.3 Hessian和Burlap 235
8.3.1 访问一个服务 236
8.3.2 导出一个服务 238
8.4 HTTP调用器 239
8.4.1 访问一个服务 239
8.4.2 导出一个服务 240
8.4.3 定制化选项 241
8.5 RMI 242
8.5.1 访问一个服务 243
8.5.2 Stub查询策略 244
8.5.3 导出一个服务 246
8.5.4 定制化选项 246
8.5.5 RMI-IIOP 247
8.6 通过JAX-RPC的Web服务 247
8.6.1 访问一个服务 248
8.6.2 导出一个服务 250
8.6.3 定制的类型映射 252
8.7 小结 253
第9章 支持性服务 255
9.1 JMS 255
9.1.1 引言 255
9.1.2 Spring的JMS支持的起因 256
9.1.3 通过模板的JMS访问 257
9.1.4 异常处理 258
9.1.5 ConnectionFactory管理 259
9.1.6 消息转换器 259
9.1.7 目的管理 260
9.1.8 事务管理 261
9.1.9 JmsGatewaySupport 261
9.1.10 前景 263
9.2 使用Spring的调度 263
9.2.1 Timer与Quartz 263
9.2.2 Timer 263
9.2.3 Quartz 265
9.3 使用Spring发送电子邮件 269
9.3.1 入门指南 270
9.3.2 重用现有的邮件会话 271
9.3.3 使用COS的邮件发送 271
9.3.4 通用的邮件管理器 271
9.4 脚本 275
9.4.1 一致性模型 275
9.4.2 其他脚本语言 278
9.5 小结 279
第10章 Spring的Acegi Security系统 280
10.1 企业级应用程序的安全选择 280
10.1.1 典型的需求 280
10.1.2 Acegi Security简介 281
10.1.3 Java身份验证和授权服务 284
10.1.4 Servlet规范 286
10.2.1 身份验证 287
10.2 Acegi Security的基础 287
10.2.2 存储身份验证对象 290
10.2.3 授权 292
10.2.4 域对象实例的安全 292
10.3 范例代码 295
10.3.1 范例介绍 295
10.3.2 安全所不知道的实现 295
10.3.3 安全方法 298
10.3.4 身份验证 298
10.3.5 授权 299
10.4 小结 302
11.1 对EJB的需要做出决断 303
第11章 Spring与EJB 303
11.2 访问EJB 304
11.2.1 样板方法 304
11.2.2 Spring的方法 305
11.3 用Spring实现EJB 310
11.3.1 无状态会话Bean 310
11.3.2 有状态会话Bean 313
11.3.3 消息驱动的Bean 314
11.3.4 几句题外话:谈谈XDoclet 315
11.4 单态容器访问,是好还是坏 315
11.4.1 ContextSingletonBean-FactoryLocator和SingletonBean-FactoryLocator 316
11.4.2 共享的上下文作为Web应用程序的应用程序上下文的双亲 318
11.5.2 使用模仿的EJB容器 321
11.5.1 在POJO委托中实现业务功能 321
11.5 测试关注点 321
11.4.3 使用来自EJB的共享的上下文 321
11.5.3 应用程序服务器内部的集成测试 322
11.6 小结 323
第12章 Web MVC框架 324
12.1 简单的例子 324
12.2 一般的体系结构 326
12.2.1 Web MVC概念 326
12.2.2 使用分发器和控制器的通用Web MVC 327
12.2.3 好的Web MVC框架的需求 327
12.2.4 Spring的Web MVC的等价物 328
12.3 基础设施组件 330
12.3.1 DispatcherServlet 330
12.3.2 WebApplicationContext 333
12.4 处理请求有关的工作流 334
12.5 Spring MVC Web应用程序的一般布局 336
12.6 HandlerMapping 337
12.6.1 BeanNameUrlHandler-Mapping 338
12.6.2 SimpleUrlHandlerMapping 338
12.6.3 CommonsPathMapUrlHandler-Mapping 339
12.6.4 多个HandlerMapping 340
12.7 HandlerExecutionChain和拦截器 341
12.7.1 WebContentInterceptor 342
12.7.2 UserRoleAuthorizationInterceptor 343
12.7.3 Spring MVC提供的其他处理器拦截器 343
12.8 处理器及其适配器 343
12.9 ModelAndView和ViewResolvers 343
12.9.2 BeanNameViewResolver和XmlViewResolver 344
12.9.1 UrlBasedViewResolver 344
12.9.3 ResourceBundleViewResolver 345
12.9.4 视图解析器链接 345
12.10 地区值的改变和解析 347
12.11 HandlerExceptionResolvers 348
12.12 控制器 350
12.12.1 WebContentGenerator 350
12.12.2 AbstractController 350
12.12.3 UrlFilenameViewController 351
12.12.4 ParameterizableViewController 351
12.12.5 MultiActionController 352
12.13 数据绑定 352
12.14.1 使用AbstractController查看演出列表 354
12.14 使用控制器的实际例子 354
12.14.2 预订 356
12.15 向导功能 362
12.15.1 基本配置 362
12.15.2 模板方法 363
12.15.3 向导流程 363
12.15.4 页面改变、编号和其他动作 363
12.16 扩展Spring处理器的基础设施 365
12.17 上传文件 365
12.17.1 配置多部分解析器 365
12.17.2 创建表单来上传文件 366
12.17.3 处理上传的数据 366
12.18 测试控制器 367
12.18.1 无须应用程序上下文的测试 368
12.18.2 使用模仿对象的更广泛测试 369
12.18.3 使用完全的应用程序上下文测试 370
12.18.4 测试Web应用程序的其他方法 370
12.19 小结 371
第13章 Web视图技术 372
13.1 一个例子 372
13.1.1 通用配置 373
13.1.2 JSP 373
13.1.3 FreeMarker 373
13.1.4 使用iText生成PDF 374
13.2 选择技术时的注意事项 375
13.3 视图对象和模型 375
13.4 AbstractView提供的特性 376
13.4.1 使用RedirectView发布新的请求 377
13.4.2 使用视图前缀发布转向或者重定向 378
13.5 JSP 379
13.5.1 配置应用程序以使用JSP 379
13.5.2 使用定制标记创建表单 380
13.5.3 使用标记文件创建可重用的元素 385
13.6 Velocity和FreeMarker 385
13.6.1 配置视图解析器 386
13.6.2 使用表单简化宏 388
13.7 Tiles 390
13.8 基于XML和XSLT的视图 393
13.9 Excel和基于其他文档的视图 394
13.9.1 从表演列表生成Excel文件 394
13.9.2 以模板作为Excel文件的基础 395
13.9.4 使用HandlerInterceptor区分HTML和Excel 396
13.9.3 基于其他文档的视图 396
13.10 实现定制视图 398
13.10.1 View和AbstractView 398
13.10.2 实现从数据对象生成XML的视图 398
13.10.3 实现定制视图时的注意事项 400
13.11 小结 400
第14章 与其他Web框架集成 401
14.1 选择MVC框架时的注意事项 401
比较传统的Web MVC框架 401
14.2 与Spring集成:核心概念 408
14.3 WebWork集成 410
设置ObjectFactory 410
14.4 Struts集成 411
14.4.1 使用AetionSupport 412
14.4.2 使用DelegationRequestProcessor和DelegationActionProxy 413
14.4.3 使用自动装配的基本动作 415
14.5 Tapestry集成 416
14.5.1 为Tapestry准备Bean 416
14.5.2 页面类 417
14.5.3 页面定义 417
14.5.4 页面模板 418
14.5.5 Tapestry集成的最终思考 420
14.6 JSF集成 420
14.7 小结 421
第15章 样本应用程序 422
15.1 服务器技术的选择 422
15.2 应用层 422
15.3.1 数据模型 423
15.3 持久性层 423
15.3.2 域对象模型 425
15.3.3 对象/关系映射 426
15.3.4 DAO实现 429
15.3.5 数据访问上下文 430
15.4 业务服务层 431
15.4.1 服务 431
15.4.2 应用程序上下文 432
15.5 Web层 433
15.5.1 应用程序流程 434
15.5.2 通过web.xml配置应用程序 434
15.5.3 Web控制器 435
15.5.4 视图技术 437
15.6.2 数据库变化 438
15.6 与J2EE设计和开发实现的比较 438
15.6.1 更简单的技术 438
15.7 服务器配置 439
15.7.1 MySQL 439
15.7.2 Tomcat 439
15.8 构建和部署 440
15.8.1 创建和载入数据库表 440
15.8.2 构建应用程序并部署到Tomcat服务器 440
15.9 小结 440
第16章 结论 441
16.1 Spring解决的问题 441
16.2 Spring解决方案 441
16.3.1 技术选择 443
16.3 Spring开发的指导方针 443
16.3.2 层与层 444
16.3.3 构造应用程序 448
16.3.4 测试应用程序 451
16.4 相关项目 452
16.4.1 Spring的Acegi Security 452
16.4.2 其他项目 452
16.5 非J2EE环境中的Spring 453
16.6 发现更多 454
16.6.1 书籍和文章 454
16.6.2 在线资源 454
16.6.3 样本应用程序 454
16.7 前景 455
A.2 用户群体 457
A.2.1 公众Internet用户 457
附录A 样本应用程序的需求 457
A.1 概述 457
A.2.2 售票处用户 458
A.2.3 系统管理员 458
A.3 假设 458
A.4 范围限制 459
A.5 交付时间表 459
A.6 Internet用户界面 459
A.6.1 基本工作流 459
A.6.2 错误处理 460
A.6.3 应用程序屏幕 460
A.7 非功能性需求 469
A.8 硬件和软件环境 470