《Spring实战(第三版)》阅读

Spring是我们离不开的开发框架, 我对这个经典框架的了解基本都来自于实际工作。 偶然看到一本书《Spring实战(第三版)》, 打算读读, 完善下知识结构。有同事说, 这书没意思, 学不到什么。然而在看书这件事上, 我向来不大听劝, 闲暇时读读罢, 至少比虚拟机规范之类的书接地气, 读起来也快。

一、下载地址

《Spring实战(第三版)》

二、目录

第一部分 Spring 的核心   

第1 章 Spring 之旅
1.1 简化Java 开发
1.1.1 激发POJO 的潜能
1.1.2 依赖注入
1.1.3 应用切面
1.1.4 使用模板消除样板式代码
1.2 容纳你的Bean
1.2.1 与应用上下文共事
1.2.2 Bean 的生命周期
1.3 俯瞰Spring 风景线
1.3.1 Spring 模块
1.3.2 Spring Portfolio
1.4 Spring 新功能
1.4.1 Spring 2.5 新特性
1.4.2 Spring 3.0 新特性
1.4.3 Spring Portfollo 新特性
1.5 小结

第2 章 装配Bean

2.1 声明Bean
2.1.1 创建Spring 配置
2.1.2 声明一个简单Bean
2.1.3 通过构造器注入
2.1.4 Bean 的作用域
2.1.5 初始化和销毁Bean
2.2 注入Bean 属性
2.2.1 注入简单值
2.2.2 引用其他Bean
2.2.3 使用Spring 的命名空间p 装配属性
2.2.4 装配集合
2.2.5 装配空值
2.3 使用表达式装配

SpEL表达式, 过去从未用过, 以后尝试下

2.3.1 SpEL 的基本原理
2.3.2 在SpEL 值上执行操作
2.3.3 在SpEL 中筛选集合
2.4 小结

第3 章 最小化Spring XML 配置

3.1 自动装配Bean 属性
3.1.1 4 种类型的自动装配

四种自动装配类型分别为byType, byName, autodetect, constructor. 书中对前三者的表述很清晰, 而关于constructor的描述却十分模糊。 博文从头认识Spring-2.1 自动装配(3)-constructor很清晰地阐述了constructor自动装配的含义, 即根据构造器需传入的参数, 先按byType匹配, 再按byName匹配。

3.1.2 默认自动装配

在beans标签中加入属性default-autowire="xxx", 则beans下的全部bean的自动装配类型都被指定为xxx。

3.1.3 混合使用自动装配和显式装配

显式和自动装配都存在的情况下, 系统对显式装配的优先级大于自动装配。 但有例外:当使用constructor装配策略时, 必须让Spring自动装配构造器的所有入参, 不得混入<constructor-arg>。

3.2 使用注解装配
3.2.1 使用@Autowired
3.2.2 借助@Inject 实现基于标准的自动装配

    没用过@Inject注记, 以后尝试下
(1)@Autowired有required属性,如果设为false,这如果没有找到对应的bean是不会抛异常的。@Inject和@Resource没有提供对应的配置,所以必须找到否则会抛异常。
(2)@Autowired和@Inject基本一样,因为两者都是使用AutowiredAnnotationBeanPostProcessor来处理依赖注入。
(3)@Inject是JSR330的注解。@Autowired是spring的注解。

3.2.3 在注解注入中使用表达式
3.3 自动检测Bean
3.3.1 为自动检测标注Bean
3.3.2 过滤组件扫描
3.4 使用Spring 基于Java的配置
3.4.1 创建基于Java 的配置
3.4.2 定义一个配置类
3.4.3 声明一个简单的Bean
3.4.4 使用Spring 的基于Java 的配置进行注入
3.5 小结

第4 章 面向切面的Spring

4.1 什么是面向切面编程
4.1.1 定义AOP 术语

通知(Advice)、连接点(Joinpoint)、切点(Pointcut)、切面(Aspect)、引入(Introduction)、织入(Weaving)

4.1.2 Spring 对AOP 的支持
4.2 使用切点选择连接点
4.2.1 编写切点
4.2.2 使用Spring 的bean()指示器
4.3 在XML 中声明切面
4.3.1 声明前置和后置通知
4.3.2 声明环绕通知
4.3.3 为通知传递参数

书中仅仅简述了传递一个参数的情形。 如果需要传递多个参数该如何处理?
具体可参考文章Spring AOP 前切入点及多参数问题    
示例:
配置<aop:before method="before" pointcut="execution(* cn.xxxx..*.*(..)) and args(..)"/> 
代码public void before(JoinPoint jp) throws Throwable {  
    Object[] args = jp.getArgs();  
}

4.3.4 通过切面引入新功能

它让我想起ruby的类扩展机制。基于ruby的开源系统Redmine有着丰富的插件, 大量的插件就是通过类似的机制为核心类添加方法。
参考书中的配置, 任何衍生于types-matching所指定的接口或类A, 相当于同时实现了implement-interface所指定的接口B, default-impl指定了接口B的实现类C。注:default-impl可替换为配置delegate-ref, 后者为实现类bean的id。

4.4 注解切面
4.4.1 注解环绕通知
4.4.2 传递参数给所标注的通知
4.4.3 标注引入
4.5 注入AspectJ 切面
4.6 小结

第二部分 Spring 应用程序的核心组件

第5 章 征服数据库
5.1 Spring 的数据访问哲学
5.1.1 了解Spring 的数据访问异常体系
5.1.2 数据访问模板化
5.1.3 使用DAO 支持类
5.2 配置数据源
5.2.1 使用JNDI 数据源
5.2.2 使用数据源连接池
5.2.3 基于JDBC驱动的数据源
5.3 在Spring 中使用JDBC
5.3.1 应对失控的JDBC 代码
5.3.2 使用JDBC 模板
5.4 在Spring 中集成Hibernate

对Hibernate和Jpa的介绍实在简略, 深入学习需参考其他文档。
Spring和Jpa结合得到sping-data-jpa。这是由Spring提供的一个用于简化JPA开发的框架,也是我觉得十分顺手的框架,可书中对其并没有介绍。

5.4.1 Hibernate 概览
5.4.2 声明Hibernate 的Session工厂
5.4.3 构建不依赖于Spring的Hibernate代码
5.5 Spring 与Java 持久化API
5.5.1 配置实体管理器工厂
5.5.2 编写基于JPA 的DAO
5.6 小结

第6 章 事务管理

6.1 理解事务
6.1.1 用4 个词来表示事务

原子性、一致性、隔离性、持久性

6.1.2 理解Spring 对事务管理的支持
6.2 选择事务管理器
6.2.1 JDBC 事务
6.2.2 Hibernate 事务
6.2.3 Java 持久化API 事务
6.2.4 JTA(Java Transaction API)事务

对于多个数据源的配置讲解不够详细。参考文章Spring多数据源事务配置, 其中的坑似乎并不少。

6.3 在Spring 中的编码事务
6.4 声明式事务
6.4.1 定义事务属性

事务属性的五个方面。

isolation  事务的隔离级别
propagation 事务的传播规则
read-only 事务只读
rollback-for|no-rollback-for 事务对于哪些类型检查异常应当回滚|事务对于哪些异常应当不回滚
timeout 事务超时时间

6.4.2 在XML 中定义事务

可以在xml配置文件或者使用注解针对上述五个属性, 对事务进行设置。

6.4.3 定义注解驱动的事务
6.5 小结

第7 章 使用Spring MVC 构建Web 应用程序

7.1 Spring MVC 起步
7.1.1 跟踪Spring MVC 的请求
7.1.2 搭建Spring MVC
7.2 编写基本的控制器
7.2.1 配置注解驱动的Spring MVC

<mvc:annotation-driven />  注解驱动、JSP-303支持、信息转换、域格式化

7.2.2 定义首页的控制器
7.2.3 解析视图

提供了一种对控制器进行单元测试的方法, 可以参考

7.2.4 定义首页的视图
7.2.5 完成Spring 应用上下文

书中提到载入多个配置文件的方式:使用<context-param>配置contextConfigLocation,但并没有提到<init-param>。两者都可以配置参数,其区别可参考:context-param与init-param的区别与作用

7.3 处理控制器的输入
7.3.1 编写处理输入的控制器
7.3.2 渲染视图
7.4 处理表单
7.4.1 展现注册表单
7.4.2 处理表单输入
7.4.3 校验输入
7.5 处理文件上传
7.5.1 在表单上添加文件上传域
7.5.2 接收上传的文件
7.5.3 配置Spring 支持文件上传
7.6 小结

第8 章 使用Spring Web Flow

8.1 安装Spring Web Flow
8.1.1 在Spring 中使用Web Flow
8.2 流程的组件
8.2.1 状态
8.2.2 转移
8.2.3 流程数据
8.3 组合起来:披萨流程
8.3.1 定义基本流程
8.3.2 收集顾客信息
8.3.3 构建订单
8.3.4 支付
8.4 保护Web 流程
8.5 小结

第9 章 保护Spring 应用

曾经开发的权限系统, 一般涉及用户、角色、权限三个元素。用户具有多个角色, 角色具有多种权限。权限是硬编码在系统中的。

Spring Secure是把角色硬编码在系统中,本人感觉只只能满足简单的权限需求,并不灵活,想满足需求也需要大量的自定义设计。

也许是我对这个框架还不熟悉,以至于有误解。以后有缘再辨析罢。

9.1 Spring Security 介绍
9.1.1 Spring Security 起步
9.1.2 使用Spring Security 配置命名空间
9.2 保护Web 请求
9.2.1 代理Servlet 过滤器
9.2.2 配置最小化的Web安全性
9.2.3 拦截请求
9.3 保护视图级别的元素
9.3.1 访问认证信息的细节
9.3.2 根据权限渲染
9.4 认证用户
9.4.1 配置内存用户存储库
9.4.2 基于数据库进行认证
9.4.3 基于LDAP 进行认证
9.4.4 启用remember-me 功能
9.5 保护方法调用
9.5.1 使用@Secured 注解保护方法调用
9.5.2 使用JSR-250 的@RolesAllowed注解
9.5.3 使用SpEL 实现调用前后的安全性
9.5.4 声明方法级别的安全性切点
9.6 小结

第三部分 Spring 集成

第10 章 使用远程服务

远程服务技术始终处于高速发展中。 具体选择哪种远程服务技术还是要因地制宜,与时俱进。所以本章的内容仅大致浏览浏览。

10.1 Spring 远程调用概览
10.2 使用RMI
10.2.1 发布一个RMI 服务
10.2.2 装配RMI服务
10.3 使用Hessian 和Burlap发布远程服务
10.3.1 使用Hessian和Burlap发布Bean 的功能
10.3.2 访问Hessian/Burlap 服务
10.4 使用Spring的HttpInvoker
10.4.1 将把Bean 发布为HTTP服务
10.4.2 通过HTTP 访问服务
10.5 发布和使用Web 服务
10.5.1 创建JAX-WS 端点
10.5.2 在客户端代理JAX-WS服务
10.6 小结

第11 章 为Spring 添加REST功能

对于资源化的服务, 设计成rest风格的api是简洁优雅的。 而我在实际的开发中常常忘记这点。习惯需要培养。

还有一篇文章, 其中的返回码值得参考:理解Restful架构

11.1 了解REST
11.1.1 REST 的基本原理
11.1.2 Spring 是如何支持REST 的
11.2 编写面向资源的控制器
11.2.1 剖析RESTless 的控制器
11.2.2 处理RESTful URL
11.2.3 执行REST 动作
11.3 表述资源
11.3.1 协商资源表述
11.3.2 使用HTTP 信息转换器
11.4 编写REST 客户端
11.4.1 了解RestTemplate的操作
11.4.2 GET 资源
11.4.3 PUT 资源
11.4.4 DELETE 资源
11.4.5 POST 资源数据
11.4.6 交换资源
11.5 提交RESTful 表单
11.5.1 在JSP 中渲染隐藏的方法域
11.5.2 发布真正的请求
11.6 小结

第12 章 Spring 消息

简单介绍了JMS和开源消息代理ActiveMQ。书中并没有介绍AMQP。JMS是Java消息中间件服务的一个标准和API定义, 只能用Java编码。

AMQP提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计, 跨语言,跨平台。RabbitMQ实现了AMQP, 笔者曾经也写过一篇博文:Spring中使用RabbitMQ

12.1 JMS 简介
12.1.1 构建JMS
12.1.2 评估JMS 的优点
12.2 在Spring 中搭建消息代理
12.2.1 创建连接工厂
12.2.2 声明ActiveMQ 消息目的地
12.3 使用Spring 的JMS 模板
12.3.1 处理失控的JMS 代码
12.3.2 使用JMS 模板
12.4 创建消息驱动的POJO
12.4.1 创建消息监听器
12.4.2 配置消息监听器
12.5 使用基于消息的RPC
12.5.1 使用Spring 基于消息的RPC
12.5.2 使用Lingo 实现异步RPC
12.6 小结

第13 章 使用JMX 管理Spring Bean

13.1 将Spring Bean 导出为MBean
13.1.1 通过名称发布方法
13.1.2 使用接口定义MBean 的操作和属性
13.1.3 使用注解驱动的MBean
13.1.4 处理MBean 冲突
13.2 远程MBean
13.2.1 发布远程MBean
13.2.2 访问远程MBean
13.2.3 代理MBean
13.3 处理通知
13.3.1 监听通知
13.4 小结

第14 章 其他Spring 技巧

14.1 外部化配置
14.1.1 替换属性占位符
14.1.2 重写属性
14.1.3 加密外部属性
14.2 装配JNDI 对象
14.2.1 JNDI 的传统用法
14.2.2 装配JNDI 对象
14.2.3 将EJB 装配到Spring 中
14.3 发送邮件
14.3.1 配置邮件发送器
14.3.2 构建邮件
14.4 调度和后台任务
14.4.1 声明调度方法
14.4.2 声明异步方法
14.5 小结
14.6 结束语