内容简介 · · · · · ·
《POJOS IN ACTION中文版:用轻量级框架开发企业应用》是一本实践指南,它围绕POJO(普通Java对象)构造了一个完整的应用程序,对框架之间的各种组合进行了详细的举例说明;描述了在采用POJO和轻量级框架如Hibernate、Spring时,如何制定主要设计决策,包括怎样组织和封装业务逻辑、访问数据库、管理事务以及如何处理数据库并发等。此外,《POJOS IN ACTION中文版:用轻量级框架开发企业应用》还详尽地分析了事务管理、悲观锁、乐观锁、条件组合搜索等难点问题。
作者简介 · · · · · ·
Chris Richardson是位开发人员和架构师,他拥有超过20年的开发经验。他的咨询公司擅长启动新项目和指导开发团队。Chris曾在Insignia、BEA及其他公司担任技术主管。他拥有英国剑桥大学的计算机科学学士和硕士学位,目前住在加利福尼亚的奥克兰。
目录 · · · · · ·
前言
致谢
关于本书
关于书名
关于封面插图
目录
第一部分 POJO及轻量级框架概述
第1章 用POJO进行开发:更快捷更简单
1.1 EJB幻灭
1.1.1 EJB简史
1.1.2 典型的EJB 2应用架构
1.1.3 EJB存在的问题
1.1.4 EJB 3朝正确的方向迈出了一步
1.2 用POJO进行开发
1.2.1 使用面向对象设计
1.2.2 使用POJO
1.2.3 持久化POJO
1.2.4 消除DTO
1.2.5 使POJO具有事务性
1.2.6 用Spring配宣应用程序
1.2.7 部署POJO应用程序
1.2.8 POJO设计小结
1.3 小结
第2章 J2EE设计决策
2.1 业务逻辑和数据库访问决策
2.2 决策1:组织业务逻辑
2.2.1 使用过程式设计
2.2.2 使用面向对象设计
2.2.3 数据表模块(Table Module)模式
2.3 决策2:封装业务逻辑
2.3.1 EJB session facade
2.3.2 POJO facade
2.3.3 暴露领域模型模式(Exposed Domain Model pattern)
2.4 决策3:访问数据库
2.4.1 直接使用JDBC存在什么问题
2.4.2 使用iBATIS
2.4.3 使用持久层框架
2.5 决策4:处理数据库事务中的并发
2.5.1 隔离的(isolated)数据库事务
2.5.2 乐观锁
2.5.3 悲观锁
2.6 决策5:处理长事务中的并发
2.6.1 乐观离线锁模式
2.6.2 悲观离线锁模式
2.7 在项目中作出设计决策
2.7.1 示例应用程序概述
2.7.2 制定总体设计决策
2.7.3 制定用例级决策
2.8 小结
第二部分 更简单、更快捷的方案
第3章 使用Domain Model模式
3.1 理解领域模型模式
3.1.1 领域模型在总体架构中的位置
3.1.2 领域模型示例
3.1.3 领域模型中的各种角色
3.2 开发领域模型
3.2.1 识别类、属性和关系
3.2.2 给领域模型添加行为
3.3 实现领域模型:示例
3.3.1 实现领域服务方法
3.3.2 实现领域实体方法
3.3.3 整个设计的小结
3.4 小结
第4章 持久化领域模型概述
4.1 将对象模型映射到数据库
4.1.1 映射类
4.1.2 映射对象关系
4.1.3 映射继承
4.1.4 管理对象生命周期
4.1.5 持久对象标识
4.2 ORM框架概述
4.2.1 为何你不应自己持久化对象
4.2.2 ORM框架的主要特性
4.2.3 使用ORM框架的优点和缺点
4.3 JDO和Hibernate概述
4.3.1 对象模型和数据库模式之间的声明式映射
4.3.2 创建、读取、更新和删除对象的API
4.3.3 查询语言
4.3.4 对事务的支持
4.3.5 延迟和主动加载
4.3.6 对象缓存
4.3.7 脱管对象
4.3.8 Hibernate vs. JDO
4.4 用Spring设计仓库
4.4.1 实现JDO和Hibernate仓库
4.4.2 使用Spring ORM类
4.4.3 使仓库更易于测试
4.5 测试持久领域模型
4.5.1 对象/关系型数据库测试策略
4.5.2 测试数据库
4.5.3 不用数挹库进行测试
4.5.4 ORMUnit概述
4.6 JDO和Hibernate的性能优化
4.6.1 不进行任伺优化
4.6.2 配置主动加载
4.6.3 使用进程级缓存
4.6.4 使用查询缓存
4.7 示例模式
4.8 小结
第5章 用JDO 2.0持久化领域模型
5.1 JDO的问题和限制
5.1.1 配置JDO对象标识
5.1.2 持久化接口
5.1.3 使用JDO增强器
5.2 用JDO持久化领域模型类
5.2.1 用ORMUnit编写JDO持久化测试
5.2.2 测试持久JDO对象
5.2.3 类的持久化
5.3 实现JDO仓库
5.3.1 编写findRestaurants()的模拟对象测试
5.3.2 实现JDORestaurantRepositorylmpl
5.3.3 编写查找餐馆的查询
5.3.4 编写查询的测试
5.4 JDO性能优化
5.4.1 使用fetch group优化对象加载
5.4.2 使用PersistenceManagerFactory级缓存
5.4.3 使用查询缓存
5.5 小结
第6章 用Hibernate 3持久化领域模型
6.1 Hibernate ORM的问题
6.1.1 成员变量还是属性
6.1.2 Hibernate实体和组件
6.1.3 配置对象标识
6.1.4 使用cascade属性
6.1.5 持久化接口
6.2 Hibernate的其他问题
6.2.1 异常处理
6.2.2 延迟加载和继承层级体系
6.3 使用Hibernate持久化领域模型类
6.3.1 借助ORMUnit编写Hibernate持久化测试
6.3.2 测试持久化Hibernate对象
6.3.3 使类持久化
6.4 使用Hibernate实现仓库
6.4.1 编写仓库方法的模拟对象测试
6.4.2 实现HibernateRestaurantRepositorylmpl
6.4.3 编写查找餐馆的查询
6.4.4 编写查询的测试
6.5 Hibernate性能优化
6.5.1 使用主动加载
6.5.2 使用进程级缓存
6.5.3 使用查询缓存
6.6 小结
第7章 用POJO facade封装业务逻辑
7.1 POJO facade概述
7.1.1 示例POJO facade
7.1.2 POJO facade的优点
7.1.3 POJO facade的缺点
7.1.4 POJO facade和脱管领域对象的使用时机
7.2 POJO facade设计决策
7.2.1 封装领域对象
7.2.2 脱钩对象
7.2.3 异常 vs. 状态码(status code)
7.2.4 管理事务和连接
7.2.5 实现安全性
7.2.6 支持远程客户
7.3 设计POJO facade的接口
7.3.1 确定方法签名(signature)
7.4 实现POJO facade
7.4.1 编写POJO facade方法的测试
7.4.2 实现updateRestaurant()
7.5 实现结果工厂
7.5.1 实现Hibernate结果工厂
7.5.2 实现JDO结果工厂
7.6 用Spring部署POJO facade
7.6.1 普通bean定义
7.6.2 JDO专有bean定义
7.6.3 Hibernate bean定义
7.7 小结
第三部分 变体
第8章 使用暴露领域模型
8.1 暴露领域模型模式概述
8.1.1 应用暴露领域模型模式
8.1.2 暴露领域模型的优缺点
8.1.3 暴露领域模型模式的使用时机
8.2 使用Spring filter管理连接
8.3 管理事务
8.3.1 在表示层里管理事务
8.3.2 在业务层里管理事务
8.4 暴露领域模型模式示例
8.4.1 Servlet设计
8.4.2 JSP页面设计
8.4.3 PlaceOrderService配置
8.5 使用JDO版暴露领域模型
8.5.1 定义Spring bean
8.5.2 配置Web应用程序
8.6 使用Hibernate版的暴露领域模型
8.6.1 定义Spring bean
8.6.2 配置Web应用程序
8.7 小结
第9章 使用Transaction Script模式
9.1 Transaction Script模式概览
9.1.1 应用Transaction Script模式
9.1.2 Transaction Script模式的优缺点
9.1.3 什么时候使用Transaction Script模式
9.2 识别事务脚本
9.2.1 分析用例
9.2.2 分析用户界面
9.2.3 PlaceOrderTransactionScripts接口
9.3 实现一个POJO事务脚本
9.3.1 为事务脚本写测试
9.3.2 编写事务脚本
9.4 用iBATIS和Spring实现DAO
9.4.1 使用iBATIS和Spring的概览
9.4.2 实现DAO方法
9.5 用Spring配置事务脚本
9.5.1 Spring如何管理JDBC连接和事务
9.5.2 Spring bean定义
9.6 小结
第10章 用EJB3实现POJO
10.1 EJB 3概述
10.1.1 EJB 3的关键改进
10.1.2 EJB 3的关键限制
10.2 用EJB 3实现领域模型
10.2.1 类映射到数据库
10.2.2 实现对象库
10.2.3 测试持久化EJB领域模型
10.3 用EJB 3实现facade
10.3.1 把POJO facade转化为session bean
10.3.2 脱钩对象
10.4 组装组件
10.4.1 使用EJB依赖注入
10.4.2 集成Spring和EJB的依赖注入机制
10.4.3 使用Spring依赖注入
10.5 用EJB 3实现其他模式
10.5.1 实现Exposed Domain Model模式
10.5.2 实现Transaction Script模式
10.5.3 实现动态分页查询
10.5.4 实现并发模式
10.6 小结
第四部分 处理数据库和并发
第11章 实现动态分页查询
11.1 关键设计间题
11.1.1 实现分页机制
11.1.2 动态产生查询语句
11.1.3 提高SQL查询的效率
11.2 用iBATIS实现动态分页查询
11.2.1 使用queryForList()选择记录
11.2.2 使用ROWNUM选择记录
11.3 用JDO和Hibernate实现同样的分页查询
11.3.1 动态生成Hibernate和JDO查询语句
11.3.2 只用一条SELECT语句装载数据
11.3.3 装载对象属性的子集
11.3.4 处理反规范化数据库模式
11.3.5 实现分页
11.4 JDO设计例子
11.4.1 JDOOrderRepositorylmpl类
11.4.2 ExecuteFindOrdersQuery类
11.5 Hibernate设计例子
11.5.1 HibernateOrderRepositorylmpl类
11.5.2 FindOrdersHibernateCallback类
11.6 使用JDO和Hibernate的native SQL查询
11.6.1 使用JOO native SQL查询
11.6.2 使用Hibernate SQL查询语句
11.7 小结
第12章 数据库事务和并发
12.1 处理共享数据的并发访间
12.1.1 使用完全隔离的事务
12.1.2 乐观锁
12.1.3 悲观锁
12.1.4 锁机制的组合使用
12.2 在JDBC/iBATIS应用程序中处理并发更新
12.2.1 设计概要
12.2.2 使用乐观锁
12.2.3 使用悲观锁
12.2.4 使用serializable或者repeatable read隔离级别的事务
12.2.5 通知并发更新失败
12.3 用JDO和Hlberante处理并发更新
12.3.1 领域模型设计例子
12.3.2 用JDO处理并发更新
12.3.3 Hibernate处理并发更新
12.4 从数据并发失败中恢复
12.4.1 使用AOP interceptor重试事务
12.4.2 配置AOP拦截器
12.5 小结
第13章 使用离线锁模式
13.1 离线锁的需求
13.1.1 编辑用例
13.1.2 编缉用例中处理并发
13.2 乐观离线锁概述
13.2.1 应用乐观离线锁
13.2.2 优缺点
13.2.3 什么情况下使用乐观离线锁模式
13.3 JDO和Hibernate的乐观离线锁
13.3.1 使用版本号和时间戳
13.3.2 使用脱管对象
13.4 脱管对象实现乐观离线锁的例子
13.4.1 实现领域服务
13.4.2 实现待久化领域类
13.4.3 脱钩和挂钩订单
13.5 悲观离线锁模式
13.5.1 动因
13.5.2 使用悲观离线锁模式
13.5.3 优缺点
13.5.4 什么时候使用悲观离线锁模式
13.6 悲观离线锁设计决策
13.6.1 决定锁住什么
13.6.2 决定什么时候加锁,什么时候解锁
13.6.3 选择锁的类型
13.6.4 识别锁的持有者
13.6.5 维护锁
13.6.6 处理锁失败
13.7 在领域模型中使用悲观离线锁
13.7.1 用iBATIS实现Lock Manager
13.7.2 实现领域服务
13.7.3 调整其他用例
13.8 小结
参考资料
索引
· · · · · · (收起)
致谢
关于本书
关于书名
关于封面插图
目录
第一部分 POJO及轻量级框架概述
第1章 用POJO进行开发:更快捷更简单
1.1 EJB幻灭
1.1.1 EJB简史
1.1.2 典型的EJB 2应用架构
1.1.3 EJB存在的问题
1.1.4 EJB 3朝正确的方向迈出了一步
1.2 用POJO进行开发
1.2.1 使用面向对象设计
1.2.2 使用POJO
1.2.3 持久化POJO
1.2.4 消除DTO
1.2.5 使POJO具有事务性
1.2.6 用Spring配宣应用程序
1.2.7 部署POJO应用程序
1.2.8 POJO设计小结
1.3 小结
第2章 J2EE设计决策
2.1 业务逻辑和数据库访问决策
2.2 决策1:组织业务逻辑
2.2.1 使用过程式设计
2.2.2 使用面向对象设计
2.2.3 数据表模块(Table Module)模式
2.3 决策2:封装业务逻辑
2.3.1 EJB session facade
2.3.2 POJO facade
2.3.3 暴露领域模型模式(Exposed Domain Model pattern)
2.4 决策3:访问数据库
2.4.1 直接使用JDBC存在什么问题
2.4.2 使用iBATIS
2.4.3 使用持久层框架
2.5 决策4:处理数据库事务中的并发
2.5.1 隔离的(isolated)数据库事务
2.5.2 乐观锁
2.5.3 悲观锁
2.6 决策5:处理长事务中的并发
2.6.1 乐观离线锁模式
2.6.2 悲观离线锁模式
2.7 在项目中作出设计决策
2.7.1 示例应用程序概述
2.7.2 制定总体设计决策
2.7.3 制定用例级决策
2.8 小结
第二部分 更简单、更快捷的方案
第3章 使用Domain Model模式
3.1 理解领域模型模式
3.1.1 领域模型在总体架构中的位置
3.1.2 领域模型示例
3.1.3 领域模型中的各种角色
3.2 开发领域模型
3.2.1 识别类、属性和关系
3.2.2 给领域模型添加行为
3.3 实现领域模型:示例
3.3.1 实现领域服务方法
3.3.2 实现领域实体方法
3.3.3 整个设计的小结
3.4 小结
第4章 持久化领域模型概述
4.1 将对象模型映射到数据库
4.1.1 映射类
4.1.2 映射对象关系
4.1.3 映射继承
4.1.4 管理对象生命周期
4.1.5 持久对象标识
4.2 ORM框架概述
4.2.1 为何你不应自己持久化对象
4.2.2 ORM框架的主要特性
4.2.3 使用ORM框架的优点和缺点
4.3 JDO和Hibernate概述
4.3.1 对象模型和数据库模式之间的声明式映射
4.3.2 创建、读取、更新和删除对象的API
4.3.3 查询语言
4.3.4 对事务的支持
4.3.5 延迟和主动加载
4.3.6 对象缓存
4.3.7 脱管对象
4.3.8 Hibernate vs. JDO
4.4 用Spring设计仓库
4.4.1 实现JDO和Hibernate仓库
4.4.2 使用Spring ORM类
4.4.3 使仓库更易于测试
4.5 测试持久领域模型
4.5.1 对象/关系型数据库测试策略
4.5.2 测试数据库
4.5.3 不用数挹库进行测试
4.5.4 ORMUnit概述
4.6 JDO和Hibernate的性能优化
4.6.1 不进行任伺优化
4.6.2 配置主动加载
4.6.3 使用进程级缓存
4.6.4 使用查询缓存
4.7 示例模式
4.8 小结
第5章 用JDO 2.0持久化领域模型
5.1 JDO的问题和限制
5.1.1 配置JDO对象标识
5.1.2 持久化接口
5.1.3 使用JDO增强器
5.2 用JDO持久化领域模型类
5.2.1 用ORMUnit编写JDO持久化测试
5.2.2 测试持久JDO对象
5.2.3 类的持久化
5.3 实现JDO仓库
5.3.1 编写findRestaurants()的模拟对象测试
5.3.2 实现JDORestaurantRepositorylmpl
5.3.3 编写查找餐馆的查询
5.3.4 编写查询的测试
5.4 JDO性能优化
5.4.1 使用fetch group优化对象加载
5.4.2 使用PersistenceManagerFactory级缓存
5.4.3 使用查询缓存
5.5 小结
第6章 用Hibernate 3持久化领域模型
6.1 Hibernate ORM的问题
6.1.1 成员变量还是属性
6.1.2 Hibernate实体和组件
6.1.3 配置对象标识
6.1.4 使用cascade属性
6.1.5 持久化接口
6.2 Hibernate的其他问题
6.2.1 异常处理
6.2.2 延迟加载和继承层级体系
6.3 使用Hibernate持久化领域模型类
6.3.1 借助ORMUnit编写Hibernate持久化测试
6.3.2 测试持久化Hibernate对象
6.3.3 使类持久化
6.4 使用Hibernate实现仓库
6.4.1 编写仓库方法的模拟对象测试
6.4.2 实现HibernateRestaurantRepositorylmpl
6.4.3 编写查找餐馆的查询
6.4.4 编写查询的测试
6.5 Hibernate性能优化
6.5.1 使用主动加载
6.5.2 使用进程级缓存
6.5.3 使用查询缓存
6.6 小结
第7章 用POJO facade封装业务逻辑
7.1 POJO facade概述
7.1.1 示例POJO facade
7.1.2 POJO facade的优点
7.1.3 POJO facade的缺点
7.1.4 POJO facade和脱管领域对象的使用时机
7.2 POJO facade设计决策
7.2.1 封装领域对象
7.2.2 脱钩对象
7.2.3 异常 vs. 状态码(status code)
7.2.4 管理事务和连接
7.2.5 实现安全性
7.2.6 支持远程客户
7.3 设计POJO facade的接口
7.3.1 确定方法签名(signature)
7.4 实现POJO facade
7.4.1 编写POJO facade方法的测试
7.4.2 实现updateRestaurant()
7.5 实现结果工厂
7.5.1 实现Hibernate结果工厂
7.5.2 实现JDO结果工厂
7.6 用Spring部署POJO facade
7.6.1 普通bean定义
7.6.2 JDO专有bean定义
7.6.3 Hibernate bean定义
7.7 小结
第三部分 变体
第8章 使用暴露领域模型
8.1 暴露领域模型模式概述
8.1.1 应用暴露领域模型模式
8.1.2 暴露领域模型的优缺点
8.1.3 暴露领域模型模式的使用时机
8.2 使用Spring filter管理连接
8.3 管理事务
8.3.1 在表示层里管理事务
8.3.2 在业务层里管理事务
8.4 暴露领域模型模式示例
8.4.1 Servlet设计
8.4.2 JSP页面设计
8.4.3 PlaceOrderService配置
8.5 使用JDO版暴露领域模型
8.5.1 定义Spring bean
8.5.2 配置Web应用程序
8.6 使用Hibernate版的暴露领域模型
8.6.1 定义Spring bean
8.6.2 配置Web应用程序
8.7 小结
第9章 使用Transaction Script模式
9.1 Transaction Script模式概览
9.1.1 应用Transaction Script模式
9.1.2 Transaction Script模式的优缺点
9.1.3 什么时候使用Transaction Script模式
9.2 识别事务脚本
9.2.1 分析用例
9.2.2 分析用户界面
9.2.3 PlaceOrderTransactionScripts接口
9.3 实现一个POJO事务脚本
9.3.1 为事务脚本写测试
9.3.2 编写事务脚本
9.4 用iBATIS和Spring实现DAO
9.4.1 使用iBATIS和Spring的概览
9.4.2 实现DAO方法
9.5 用Spring配置事务脚本
9.5.1 Spring如何管理JDBC连接和事务
9.5.2 Spring bean定义
9.6 小结
第10章 用EJB3实现POJO
10.1 EJB 3概述
10.1.1 EJB 3的关键改进
10.1.2 EJB 3的关键限制
10.2 用EJB 3实现领域模型
10.2.1 类映射到数据库
10.2.2 实现对象库
10.2.3 测试持久化EJB领域模型
10.3 用EJB 3实现facade
10.3.1 把POJO facade转化为session bean
10.3.2 脱钩对象
10.4 组装组件
10.4.1 使用EJB依赖注入
10.4.2 集成Spring和EJB的依赖注入机制
10.4.3 使用Spring依赖注入
10.5 用EJB 3实现其他模式
10.5.1 实现Exposed Domain Model模式
10.5.2 实现Transaction Script模式
10.5.3 实现动态分页查询
10.5.4 实现并发模式
10.6 小结
第四部分 处理数据库和并发
第11章 实现动态分页查询
11.1 关键设计间题
11.1.1 实现分页机制
11.1.2 动态产生查询语句
11.1.3 提高SQL查询的效率
11.2 用iBATIS实现动态分页查询
11.2.1 使用queryForList()选择记录
11.2.2 使用ROWNUM选择记录
11.3 用JDO和Hibernate实现同样的分页查询
11.3.1 动态生成Hibernate和JDO查询语句
11.3.2 只用一条SELECT语句装载数据
11.3.3 装载对象属性的子集
11.3.4 处理反规范化数据库模式
11.3.5 实现分页
11.4 JDO设计例子
11.4.1 JDOOrderRepositorylmpl类
11.4.2 ExecuteFindOrdersQuery类
11.5 Hibernate设计例子
11.5.1 HibernateOrderRepositorylmpl类
11.5.2 FindOrdersHibernateCallback类
11.6 使用JDO和Hibernate的native SQL查询
11.6.1 使用JOO native SQL查询
11.6.2 使用Hibernate SQL查询语句
11.7 小结
第12章 数据库事务和并发
12.1 处理共享数据的并发访间
12.1.1 使用完全隔离的事务
12.1.2 乐观锁
12.1.3 悲观锁
12.1.4 锁机制的组合使用
12.2 在JDBC/iBATIS应用程序中处理并发更新
12.2.1 设计概要
12.2.2 使用乐观锁
12.2.3 使用悲观锁
12.2.4 使用serializable或者repeatable read隔离级别的事务
12.2.5 通知并发更新失败
12.3 用JDO和Hlberante处理并发更新
12.3.1 领域模型设计例子
12.3.2 用JDO处理并发更新
12.3.3 Hibernate处理并发更新
12.4 从数据并发失败中恢复
12.4.1 使用AOP interceptor重试事务
12.4.2 配置AOP拦截器
12.5 小结
第13章 使用离线锁模式
13.1 离线锁的需求
13.1.1 编辑用例
13.1.2 编缉用例中处理并发
13.2 乐观离线锁概述
13.2.1 应用乐观离线锁
13.2.2 优缺点
13.2.3 什么情况下使用乐观离线锁模式
13.3 JDO和Hibernate的乐观离线锁
13.3.1 使用版本号和时间戳
13.3.2 使用脱管对象
13.4 脱管对象实现乐观离线锁的例子
13.4.1 实现领域服务
13.4.2 实现待久化领域类
13.4.3 脱钩和挂钩订单
13.5 悲观离线锁模式
13.5.1 动因
13.5.2 使用悲观离线锁模式
13.5.3 优缺点
13.5.4 什么时候使用悲观离线锁模式
13.6 悲观离线锁设计决策
13.6.1 决定锁住什么
13.6.2 决定什么时候加锁,什么时候解锁
13.6.3 选择锁的类型
13.6.4 识别锁的持有者
13.6.5 维护锁
13.6.6 处理锁失败
13.7 在领域模型中使用悲观离线锁
13.7.1 用iBATIS实现Lock Manager
13.7.2 实现领域服务
13.7.3 调整其他用例
13.8 小结
参考资料
索引
· · · · · · (收起)
原文摘录 · · · · · · ( 全部 )
-
表示层或facade首先调用PlaceOrderService更新PendingOrder,然后调用RestaurantRepository获取可选餐馆,PlaceOrderService并不返回可选餐馆的列表,如果它这么做了,就会和UI设计仅仅耦合在一起。最好让服务和UI分离,让领域模型的客户再次调用领域模型以取得它要显示的数据。facade或表示层调用领域模型服务更新领域模型,并调用仓库取得显示给用户的数据。领域模型被本地调用给调用,因此多次调用并无太大开销,这一点非常重要。 (查看原文) —— 引自第74页 -
访问仓库的各种选择 仓库主要由领域服务使用,不过它们也被一些实体如PendingOrder调用。要对仓库对象调用方法,调用者必须明显持有该对象的引用。此前你已看到仓库如何作为构造函数参数传入PlaceOrderSerivce。然而,就下面我要描述的理由来看,对领域模型实体,并不总能做到这一点。下面,我们来探究一下这个问题及其各种解决方法。 最便利的方案是将仓库作为构造函数参数传入实体,和它们传入服务的方式一样。这样以来,实体就能借助轻量级容器的构造子注入机制进行初始化。与将仓库作为方法参数传递相比,将仓库作为构造函数参数传递要简单得多,而且不存在使用singleton时的缺点,我稍后再作描述。然而,使用这种方案初始化实体并不那么直接,因为它与服务不同,服务一般由轻量级容器实例化,而实体则是在数据库加载时,由持久层框架创建的。 默认情况下,持久层框架使用类的默认构造函数直接创建对象,因此不可能传入任意必须的对象。有些(并非所有)持久层框架具备可配置的对象实例化机制,允许应用程序控制对象如何实例化。应用程序可以配置持久层框架,请参看http://hibernate.org/182.html[Hibernate注入]。不过,由于该方案不是到处都有,因此我们不打算在本书中使用这种方案。 另一种选择是使用静态方法和变量实现仓库。例如,你可以singleton或ThreadLocal实现仓库。这种方案对所有持久层框架都有效,而且不要求仓库到处传递,有时,代码可能因此过于复杂。静态方法和变量存在的问题是它们使代码更难测试。例如,它们会阻止你使用替代实现比如模拟对象,因为你无法把静态方法或变量的访问重定向至另一个类。由于代码依赖必须初始化的静态变量,因此它们还引入了隐藏的依赖。总之,最好避免静态方法和变量。 由于只有某些持久层框架允许你使用构造子注入初始化实体,而使用静态方法和变量又存在一... (查看原文) —— 引自第88页
> 全部原文摘录
喜欢读"POJOs IN ACTION中文版"的人也喜欢的电子书 · · · · · ·
支持 Web、iPhone、iPad、Android 阅读器
喜欢读"POJOs IN ACTION中文版"的人也喜欢 · · · · · ·
POJOs IN ACTION中文版的书评 · · · · · · ( 全部 4 条 )

拿到POJOs in Action,研读中
稍微浏览了本书,涵盖的框架不少: Hibernate 3.0 Spring 1.2.3 Kodo JDO 3.3 JBoss EJB 3 beta iBATIS 2.0.6 HSQLDB 1.7.2 JMock 1.0.1 JUnit 3.8.1 JPX JDO 1.1beta4 除了kodo JDO外全部是opensource软件 内容包括应用pojo于领域驱动编程,测试先行开发...
(展开)
> 更多书评 4篇
论坛 · · · · · ·
POJOs IN ACTION中文版 | 来自小武 | 1 回应 | 2015-09-06 16:54:05 |
这本书的其他版本 · · · · · · ( 全部2 )
-
Manning Publications (2006)8.3分 28人读过
在哪儿借这本书 · · · · · ·
以下书单推荐 · · · · · · ( 全部 )
- Java修炼之道 (威廉他)
- 已有图书(技术) (Qu Jinlong)
- Java轻量级开源框架-SSH&GWT等 (漫天雪眷风)
- 企业级框架 (高岩)
- 闲置书籍 (Marshall)
谁读这本书? · · · · · ·
二手市场
· · · · · ·
订阅关于POJOs IN ACTION中文版的评论:
feed: rss 2.0
0 有用 松鼠亲自奥利奥 2012-02-25 10:38:28
我个人感觉这本书更像是其他“模式”书集合起来的大杂烩,太多地方没点中要害。
0 有用 whg 2011-04-06 14:57:17
这么对得起In Action名号的书籍,作者应该与时俱进的更新一下版本了
0 有用 stephansun 2013-03-31 11:26:25
虽然是06年出版的书,但是里面关于领域驱动设计,测试驱动开发,Hibernate,Spring的一些思想依然很有价值,虽然之前也浏览过Evans的《领域驱动设计》这本业内经典,但pia用代码的方式让我直观的认识了DDD,“Talk is cheap, Show me the code”,不是么?
1 有用 lmtoo 2015-09-26 19:23:56
非常不错,通熟易懂
0 有用 Rehtron 2012-05-30 09:35:45
没有理由不看,小清新的架构模式。
1 有用 lmtoo 2015-09-26 19:23:56
非常不错,通熟易懂
0 有用 stephansun 2013-03-31 11:26:25
虽然是06年出版的书,但是里面关于领域驱动设计,测试驱动开发,Hibernate,Spring的一些思想依然很有价值,虽然之前也浏览过Evans的《领域驱动设计》这本业内经典,但pia用代码的方式让我直观的认识了DDD,“Talk is cheap, Show me the code”,不是么?
0 有用 gameboyLV 2012-10-27 10:39:31
好吧。。。终于又找到一本好书,DDD的书貌似就那么几本啊,都写得很精彩。
0 有用 Rehtron 2012-05-30 09:35:45
没有理由不看,小清新的架构模式。
0 有用 松鼠亲自奥利奥 2012-02-25 10:38:28
我个人感觉这本书更像是其他“模式”书集合起来的大杂烩,太多地方没点中要害。