Why“J2EE Without EJB” 1
為什么要“J2EE Without EJB” 1
聚光燈下的EJB 1
EJB Under the Spotlight 1
J2EE還剩什么? 3
What's Left of J2EE 3
站在十字路口的J2EE 4
J2EE at a Crossroads 4
前行的路 5
The Way Forward 5
主旋律 5
輕量級框架和容器 10
我們還應該使用EJB嗎? 11
Should We Ever Use EJB? 11
小結 12
Summary 12
Goals 13
目 標 13
生產率 13
Productivity 13
問題 14
傳統(tǒng)J2EE方案解決生產率問題的辦法 15
提升生產率更好的辦法 20
OO 26
業(yè)務需求的重要性 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
業(yè)務服務層 31
向外部暴露業(yè)務對象 35
數據訪問層,或EIS層 40
J2EE架構 42
J2EE Architectures 42
兩種EJB架構 42
兩種非EJB架構 47
J2EE架構實例 54
J2EE Architectures in Practice 54
“經典的”J2EE遠程EJB架構 54
本地EJB架構 57
特制的非EJB架構 59
iBatis JPetStore v 3.1 60
“輕量級容器架構”:示例應用系統(tǒng) 61
確定是否采用應用服務器 62
小結 63
Summary 63
The Simplicity Dividend 65
簡單性的紅利 65
復雜性的代價 65
The Cost of Complexity 65
在J2EE應用系統(tǒng)中,導致復雜性產生的原因 66
Causes of Complexity in J2EE Applications 66
導致復雜性的架構性原因 66
導致復雜性的文化性原因:一個依靠復雜性為生的產業(yè) 71
復雜到什么地步就是過度了? 75
How Much Complexity Is too Much Complexity? 75
簡單還是幼稚? 75
剛剛夠好就行嗎? 77
變化的趨勢 77
總結 78
Summary 78
EJB, Five Years on 81
EJB,五年間 81
炒作和經驗 81
Hype and Experience 81
EJB和J2EE行業(yè) 82
實踐中的EJB 82
一個過時的組件模型 82
An Aging Component Model 82
Java語言的進步 83
.NET的挑戰(zhàn) 83
Web Service 85
敏捷方法學的興起 86
關于EJB目標的混淆 86
從未出現的組件市場 88
方興未艾的新范式:AOP 88
EJB, 我們真正需要什么?為什么無狀態(tài)Session Bean如此流行? 89
What Do We Really Want from EJB, or Why Stateless Session Beans Are So Popular 89
聲明性事務管理 90
遠程調用 92
集群 92
線程管理 94
EJB實例池 94
資源池 95
安全 95
業(yè)務對象管理 96
總結:EJB的服務 97
EJB,我們不想要什么? 97
What Don’t We Want From EFJ? 97
容器的鎖定 98
丑陋的結構,泛濫的類 98
部署描述文件的地獄 100
類加載器的地獄 100
測試 100
EJB的濫用 102
復雜的編程模型 102
簡單的事情會變得困難 103
“讓開發(fā)人員忽略企業(yè)應用的復雜性”,這個目標現實嗎? 103
生產率的損失 104
可移植性的問題 104
EJB能浴火重生嗎? 104
Can EJB Reinvent Itself? 104
工具支持 104
EJB 3.0 105
神話與謬論 106
Myths and Fallacies 106
J2EE == EJB 106
使用EJB的可疑論據 107
繼續(xù)前進 107
Moving Forward 107
選擇是否使用EJB 107
傳統(tǒng)的知識 107
今天的選擇 108
后EJB時代的輿論 109
標準,創(chuàng)新,和開源 112
小結 118
Summary 118
Lightweight Containers and Inversion of Control 121
輕量級容器與控制反轉 121
輕量級容器 122
Lightweight Containers 122
什么是輕量級容器? 122
我們到底為什么需要容器? 124
輕量級容器 vs. EJB容器 125
EJB的好處 126
管理業(yè)務對象 126
Managing Business Objects 126
接口與實現的分離 126
EJB:不完善的解決方案 127
控制反轉 127
Inversion of Control 127
IoC實現策略 128
IoC容器 135
IoC容器間的移植 137
對代碼風格、測試以及開發(fā)過程的影響 138
Implications for Coding Style, Testing, and Develoment Process 138
代碼風格 138
可測試性 139
開發(fā)過程 139
使用企業(yè)級服務 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
J2EE之上的Spring 146
Web應用中的Spring 147
核心bean工廠 149
The Core Bean Factory 149
基礎接口 149
通過XML組裝bean 151
非XML格式的bean聲明 154
組裝應用對象 155
自動裝配和依賴檢查 159
構造子決議 160
生命周期回調 162
復雜的屬性值 164
資源設置 165
典型的Java/J2EE資源訪問 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
J2EE中的AOP 190
AOP in J2MM 190
定義 191
Defintions 191
歷史 194
作為AOP子集的EJB 195
EJB as a Subset of AOP 195
AOP實現策略 197
AOP Implementation Strategies 197
動態(tài)代理 197
動態(tài)字節(jié)碼生成 198
Java代碼生成 198
使用定制的類加載器 198
語言擴展 198
AOP實現 199
AOP Implementations 199
AspectJ 199
AspectWerkz 201
JBoss 4 201
Spring 203
Nanning 207
AOP聯盟 207
AOP設計問題 207
AOP Design Issues 207
AOP的危險性 207
AOP設計的建議 210
隨意點菜的J2EE 211
J2EE à 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
EJB 3.0 225
編程風格的暗含意味 225
Implications for Programming Style 225
前后一致的命名規(guī)范 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
傳統(tǒng)的J2EE事務管理 232
Classic J2EE Transaction Management 232
J2EE容器作為事務協(xié)調器 233
The J2EE Container as Transaction Coordinator 233
人見人愛的CMT 234
Everybody Loves CMT 234
典型應用:本地無狀態(tài)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
選擇J2EE服務器的提示 257
Implications for J2EE Server Choice 257
小結 258
Summary 258
Persistence 261
持久化 261
常見持久化策略 262
Common Persistence Strategies 262
持久化模式概覽 262
流行的J2EE數據訪問解決方案 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
業(yè)務對象與數據訪問對象 285
DAO和透明持久化 287
數據訪問對象的種類 288
DAO設計中的問題 289
DAO基礎設施的問題 292
使用Spring框架進行數據訪問 293
Data Access with the Spring Framework 293
通用的數據訪問異常 293
再論業(yè)務對象與數據訪問對象的關系 295
JDBC 298
iBATIS SQL映射 301
JDO 302
Hibernate 304
小結 307
Summary 307
Persistence 261
持久化 261
常見持久化策略 262
Common Persistence Strategies 262
持久化模式概覽 262
流行的J2EE數據訪問解決方案 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
業(yè)務對象與數據訪問對象 285
DAO和透明持久化 287
數據訪問對象的種類 288
DAO設計中的問題 289
DAO基礎設施的問題 292
使用Spring框架進行數據訪問 293
Data Access with the Spring Framework 293
通用的數據訪問異常 293
再論業(yè)務對象與數據訪問對象的關系 295
JDBC 298
iBATIS SQL映射 301
JDO 302
Hibernate 304
小結 307
Summary 307
Replacing Other EJB Services 341
替換其它的EJB服務 341
線程管理 342
Thread Management 342
線程神話 342
EJB線程模型 345
EJB實例池 346
EJB Instance Pooling 346
何時需要實例池? 347
何時不需要實例池 347
EJB線程機制和緩沖池的替代方案 349
Aiternatives to EJB Threading and Pooling 349
線程模型 349
ThreadLocal“緩沖池” 357
實例池概述 358
聲明性安全 359
Declarative Security 359
EJB安全模型 359
EJB模型的缺陷 359
借助AOP的聲明式安全 359
JMS和消息驅動Bean 360
JMS and Message-driven Beans 360
小結 360
Summary 360
Web Tier Design 363
Web層設計 363
目標和體系結構的討論 364
Goals and Architectural Issues 364
Web層設計目標 365
用Servlet和JSP定制的MVC 366
融入整體架構 368
硬編碼連接的單例業(yè)務對象 369
請求驅動的Web MVC框架 374
Request-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
測試驅動開發(fā)(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
不同實現的選擇 464
Implementation Choices 464
擺脫EJB服務設施對性能的影響 464
結果總結 469
緩存和代碼優(yōu)化 472
Caching and Code Optimization 472
代碼優(yōu)化,以及為何要避免它 472
緩存 473
潛在代碼優(yōu)化 474
調優(yōu)和部署 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
示例應用系統(tǒng) 489
Pet Store(寵物店)業(yè)務需求 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