《Expert One-on-One 千炮联网版 Development without E中文版》这本书拥有堆“看点”。譬如说,它的作者Rod Johnson拥有10年编写Java程序的经验,目前是Servlet和JDO 2.0两个JSR专家组的成员;再譬如说,书中着力介绍的Spring、Hibernate、WebWork等都是时下流行的开源框架,IoC、AOP之类都是时下流行的概念词汇。而最大的看点就赫然摆在这本书的封面上:“without E”。我们曾经在无数的书籍和文章中看到,E是千炮联网版 的核心技术之一;而Rod Johnson的这本书竟然宣称,绝大多数的千炮联网版 应用根本不需要E。这种近乎挑衅的姿态令任何一个负责的千炮联网版 架构师很难不萌生一探究竟的念头--不论你是打算赞同他还是打算驳斥他。但所有这些尽皆不是本书最大的价值所在。选择一种架构、一种技术的依据是什么?Rod Johnson认为,应该是基于实践的证据、来自历史项目或亲自试验的经验,而不是任何形式的偶像崇拜或者门户之见。书中谈到了企业应用方方面面的问题和解决办法,而这些方案无一不是这种“循证方法”的产物。除了把这些方案交给读者,Rod Johnson通过这本书希望传达的、更为重要的信息正是“循证”的工作方式——那原本就应该是程序员的工作方式。
【《Expert One-on-One 千炮联网版 Development without E(中文版 》图书目录】Why“千炮联网版 Without E” 1 为什么要“千炮联网版 Without E” 1 聚光灯下的E 1 E Under the Spotlight 1 千炮联网版 还剩什么? 3 What's Left of 千炮联网版 3 站在十字路口的千炮联网版 4 千炮联网版 at a Crossroads 4 前行的路 5 The Way Forward 5 主旋律 5 轻量级框架和容器 10 我们还应该使用E吗? 11 Should We Ever Use E? 11 小结 12 Summary 12 Goals 13 目 标 13 生产率 13 Productivity 13 问题 14 传统千炮联网版 方案解决生产率问题的办法 15 提升生产率更好的办法 20 OO 26 业务需求的重要性 28 The Importance Of Business Requirements 28 经验过程的重要性 28 The Importance Of An Empirical Process 28 小结 29 Summary 29 Architectures 31 各种架构 31 架构性构件 31 Architectural Building Blocks 31 业务服务层 31 向外部暴露业务对象 35 数据访问层,或EIS层 40 千炮联网版 架构 42 千炮联网版 Architectures 42 两种E架构 42 两种非E架构 47 千炮联网版 架构实例 54 千炮联网版 Architectures in Practice 54 “经典的”千炮联网版 远程E架构 54 本地E架构 57 特制的非E架构 59 iBatis JPetStore v 3.1 60 “轻量级容器架构”:示例应用系统 61 确定是否采用应用服务器 62 小结 63 Summary 63 The Simplicity Dividend 65 简单性的红利 65 复杂性的代价 65 The Cost of Complexity 65 在千炮联网版 应用系统中,导致复杂性产生的原因 66 Causes of Complexity in 千炮联网版 Applications 66 导致复杂性的架构性原因 66 导致复杂性的文化性原因:一个依靠复杂性为生的产业 71 复杂到什么地步就是过度了? 75 How Much Complexity Is too Much Complexity? 75 简单还是幼稚? 75 刚刚够好就行吗? 77 变化的趋势 77 总结 78 Summary 78 E, Five Years on 81 E,五年间 81 炒作和经验 81 Hype and Experience 81 E和千炮联网版 行业 82 实践中的E 82 一个过时的组件模型 82 An Aging Component Model 82 Java语言的进步 83 .NET的挑战 83 Web Service 85 敏捷方法学的兴起 86 关于E目标的混淆 86 从未出现的组件市场 88 方兴未艾的新范式:AOP 88 E, 我们真正需要什么?为什么无状态Session Bean如此流行? 89 What Do We Really Want from E, or Why Stateless Session Beans Are So Popular 89 声明性事务管理 90 远程调用 92 集群 92 线程管理 94 E实例池 94 资源池 95 安全 95 业务对象管理 96 总结:E的服务 97 E,我们不想要什么? 97 What Don’t We Want From EFJ? 97 容器的锁定 98 丑陋的结构,泛滥的类 98 部署描述文件的地狱 100 类加载器的地狱 100 测试 100 E的滥用 102 复杂的编程模型 102 简单的事情会变得困难 103 “让开发人员忽略企业应用的复杂性”,这个目标现实吗? 103 生产率的损失 104 可移植性的问题 104 E能浴火吗? 104 Can E Reinvent Itself? 104 工具支持 104 E 3.0 105 神话与谬论 106 Myths and Fallacies 106 千炮联网版 == E 106 使用E的可疑论据 107 继续前进 107 Moving Forward 107 选择是否使用E 107 传统的知识 107 今天的选择 108 后E时代的舆论 109 标准,创新,和开源 112 小结 118 Summary 118 Lightweight Containers and Inversion of Control 121 轻量级容器与控制反转 121 轻量级容器 122 Lightweight Containers 122 什么是轻量级容器? 122 我们到底为什么需要容器? 124 轻量级容器 vs. E容器 125 E的好处 126 管理业务对象 126 Managing Business Objects 126 接口与实现的分离 126 E:不完善的解决方案 127 控制反转 127 Inversion of Control 127 IoC实现策略 128 IoC容器 135 IoC容器间的移植 137 对代码风格、测试以及开发过程的影响 138 Implications for Coding Style, Testing, and Develoment Process 138 代码风格 138 可测试性 139 开发过程 139 使用企业级服务 139 Applying Enterprise Services 139 小结 141 Summary 141 Introducing the Spring Framework 143 Spring框架简介 143 来历与动机 143 History and Motivation 143 一个分层的应用框架 144 A layered Application Framework 144 基础构建模块 145 千炮联网版 之上的Spring 146 Web应用中的Spring 147 核心bean工厂 149 The Core Bean Factory 149 基础接口 149 通过XML组ean 151 非XML格式的bean声明 154 组装应用对象 155 自动装配和依赖检查 159 构造子决议 160 生命周期回调 162 复杂的属性值 1 资源设置 165 典型的Java/千炮联网版 资源访问 166 bean容器中的资源声明 168 工厂bean 171 Spring应用上下文 175 The Spring Application Context 175 生命周期回调 177 信息源 178 文件资源 180 Bean Factory 后处理 182 小结 184 Summary 184 Declarative Middleware Using AOP Concepts 187 基于AOP概念的声明性中间件 187 AOP 101 188 动机 188 千炮联网版 中的AOP 190 AOP in J2MM 190 定义 191 Defintions 191 历史 194 作为AOP子集的E 195 E as a Subset of AOP 195 AOP实现策略 197 AOP Implementation Strategies 197 动态代理 197 动态字节码生成 198 Java代码生成 198 使用定制的类加载器 198 语言扩展 198 AOP实现 199 AOP Implementations 199 AspectJ 199 AspectWerkz 201 oss 4 201 Spring 203 Nanning 207 AOP联盟 207 AOP设计问题 207 AOP Design Issues 207 AOP的危险性 207 AOP设计的建议 210 随意点菜的千炮联网版 211 千炮联网版 à Ia carte 211 Spring中的AOP实践 212 AOP in Practice with Spring 212 使用ProxyFactoryBean 213 便利的FactoryBean 217 自动代理 218 编程用法 219 使用源码级元数据提供AOP之上的抽象 220 Using Source-level Metadata to Provide an Abstraction above AOP 220 .NET范例 220 概念级元数据 vs. 实现级元数据 221 编程访问上下文信息 222 Spring范例 222 E 3.0 225 编程风格的暗含意味 225 Implications for Programming Style 225 前后一致的命名规范 225 避免依赖AOP基础设施 226 受控异常和增强 227 参考资料 227 References 227 书籍 227 论文 227 文章和在线资源 227 小结 228 Summary 228 Transaction Management 231 事务管理 231 上层(High-level)事务管理 231 High-level Transaction Management 231 传统的千炮联网版 事务管理 232 Classic 千炮联网版 Transaction Management 232 千炮联网版 容器作为事务协调器 233 The 千炮联网版 Container as Transaction Coordinator 233 人见人爱的CMT 234 Everybody Loves CMT 234 典型应用:本地无状态Session Beans 235 直接使用JTA 236 Direct Use of JTA 236 插曲:远程事务传播 237 Interlude:Remote Transaction Propagation 237 轻量级事务基础设施 238 Lightweight Transaction Infrastructure 238 Spring Framework的事务管理 239 Transaction Management with the Spring Framework 239 事务声明 240 编程式事务处理 243 Programmatic Transaction Demarcation 243 直接使用PlatformTransactionManager 243 事务模板 243 声明式事务管理 246 Declarative Transaction Demarcation 246 AOP ProxyFactoryBean和TransactionInterceptor 247 通过接口来工作的AOP ProxyFactoryBean 249 简化的配置:TransactionProxyFactoryBean 250 源代码级别的元数据 251 事务管理策略 251 Transaction Management Strategies 251 JtaTransactionManager 253 DataSourceTransactionManager 253 JdoTransactionManager 255 HibernateTransactionManager 256 选择千炮联网版 服务器的提示 257 Implications for 千炮联网版 Server Choice 257 小结 258 Summary 258 Persistence 261 持久化 261 常见持久化策略 262 Common Persistence Strategies 262 持久化模式概览 262 流行的千炮联网版 数据访问解决方案 263 选择一种持久化策略 265 透明持久化和领域对象的行为 268 Java持久化技术简史 268 A Brief History of Java Persistence Technologies 268 Java O/R映射解决方案的缓慢成长 269 entity bean的败笔 271 实践中的数据访问技术 271 Data Access Technologies in Practice 271 资源管理 272 JDBC 273 iBATIS SQL映射 275 JDO 278 Hibernate 281 数据访问对象(DAO)模式 285 The Data Access Object Pattern 285 业务对象与数据访问对象 285 DAO和透明持久化 287 数据访问对象的种类 288 DAO设计中的问题 289 DAO基础设施的问题 292 使用Spring框架进行数据访问 293 Data Access with the Spring Framework 293 通用的数据访问异常 293 再论业务对象与数据访问对象的关系 295 JDBC 298 iBATIS SQL映射 301 JDO 302 Hibernate 304 小结 307 Summary 307
Persistence 261 持久化 261 常见持久化策略 262 Common Persistence Strategies 262 持久化模式概览 262 流行的千炮联网版 数据访问解决方案 263 选择一种持久化策略 265 透明持久化和领域对象的行为 268 Java持久化技术简史 268 A Brief History of Java Persistence Technologies 268 Java O/R映射解决方案的缓慢成长 269 entity bean的败笔 271 实践中的数据访问技术 271 Data Access Technologies in Practice 271 资源管理 272 JDBC 273 iBATIS SQL映射 275 JDO 278 Hibernate 281 数据访问对象(DAO)模式 285 The Data Access Object Pattern 285 业务对象与数据访问对象 285 DAO和透明持久化 287 数据访问对象的种类 288 DAO设计中的问题 289 DAO基础设施的问题 292 使用Spring框架进行数据访问 293 Data Access with the Spring Framework 293 通用的数据访问异常 293 再论业务对象与数据访问对象的关系 295 JDBC 298 iBATIS SQL映射 301 JDO 302 Hibernate 304 小结 307 Summary 307 Replacing Other E Services 341 替换其它的E服务 341 线程管理 342 Thread Management 342 线程神话 342 E线程模型 345 E实例池 346 E Instance Pooling 346 何时需要实例池? 347 何时不需要实例池 347 E线程机制和缓冲池的替代方案 349 Aiternatives to E Threading and Pooling 349 线程模型 349 ThreadLocal“缓冲池” 357 实例池概述 358 声明性安全 359 Declarative Security 359 E安全模型 359 E模型的缺陷 359 借助AOP的声明式安全 359 JMS和消息驱动Bean 360 JMS and Message-driven Beans 360 小结 360 Summary 360
Web Tier Design 363 Web层设计 363 目标和体系结构的讨论 3 Goals and Architectural Issues 3 Web层设计目标 365 用Servlet和JSP定制的MVC 366 融入整体架构 368 硬编码连接的单例业务对象 369 请求驱动的Web MVC框架 374 -driven Web MVC Frameworks 374 Struts 1.1 375 WebWork2 381 Spring的Web MVC框架 388 与中间层的集成 400 适宜的视图技术 401 Web MVC的其它实现方式 403 Alternative Approaches to Web MVC 403 Portals和Portlets 403 事件驱动的Web MVC框架 404 小论ASP.NET 409 总结 410 Summay 410 Unit Testing and Testability 411 单元测试与可测试性 411 为何测试很重要? 412 Why Testing Matters 412 单元测试的目标 414 Goals of Unit Tesing 414 确保可测试性 415 Ensuring Testability 415 编程风格 415 如何让你的代码难于测试 416 来自标准库的难题 420 提高可测试性的技巧 421 依赖倒置 425 AOP 425 单元测试技巧 425 Unit Testing Techniques 425 替换 425 模仿对象 426 编写有效测试 430 测试驱动开发(TDD) 433 Test-driven Development(TDD) 433 好处 433 对TDD的反对意见 434 TDD实践 436 学习TDD 436 案例研究:Spring的经验 437 Case Study:The Spring Experience 437 测试Spring应用程序 440 Testing Spring Applications 440 对POJO进行测试 440 Spring的抽象带来的好处 440 何时需要依赖Spring API? 441 使用替换配置进行测试 442 覆盖率分析和其他测试工具 443 Coverage Analysis and Other Test Tools 443 测试生成器 444 覆盖分析工具 444 突变测试工具 447 资源 448 Resources 448 小结 449 Summary 449 Performance and Scalability 452 性能与可伸缩性 452 定义 453 Definitions 453 设置清晰的目标 454 Setting Clear Goals 454 体系结构的选择:影响性能和可伸缩性的关键因素 455 Architectural Choices:The Key to Performance and Scalability 455 对象分布、集群和农场 456 不同实现的选择 4 Implementation Choices 4 摆脱E服务设施对性能的影响 4 结果总结 469 缓存和代码优化 472 Caching and Code Optimization 472 代码优化,以及为何要避免它 472 缓存 473 潜在代码优化 474 调优和部署 477 Tuning and Deployment 477 JVM 477 应用服务器 477 框架配置 478 数据库配置 478 一种循证的性能策略 479 An Evidence-based Approach to Performance 479 基准测试 480 采样(Profiling) 481 诊断 485 资源 486 Resources 486 总结 486 Summary 486 The Sample Application 489 示例应用系统 489 Pet Store(宠物店)业务需求 490 Pet Store Requirements 490 iBATIS JPetStore 3.1 490 中间层 491 远程调用机制 493 可改进的空间 494 Spring JPetStore 494 中间层 496 数据访问层 499 Web层 502 远程机制 510 访问远程服务 513 编译和部署 516 Build and Deployment 516 WAR部署中的一些问题 516 资源引用 517 JSP和JSTL 518 部署Spring JPetStore 519 小结 520 Summary 520 Conclusion 521 结 语 521 回顾 522 Looking Back 522 前行 524 Moving Forward 524 指导方针 531 Guidelines 531 写在最后 536 Last Words 536