內容介紹
本書是原創Java技術圖書領域繼《深入理解Java虛擬機》後的又一實力之作,也是全球首本基於最新OSGi R5.0規範的著作。理論方面,既全面解讀了OSGi規範,深刻揭示了OSGi原理,詳細講解了OSGi服務,又系統地介紹了Equinox框架的使用方法,並通過源碼分析了該框架的工作機制;實踐方面,不僅包含一些典型的案例,還總結了大量的最佳實踐,極具實踐指導意義。全書共14章,分4個部分。第一部分(第1章):走近OSGi,主要介紹了什麼是OSGi以及為什麼要使用OSGi。第二部分(第2~4章):OSGi規範與原理,對最新的OSGi R5.0中的核心規範進行了全面的解讀,首先講解了OSGi模組的建立、描述、依賴關係的處理,然後講解了Bundle的啟動原理和調度管理,最後講解了與本地及遠程服務相關的內容。第三部分:OSGi服務與Equinox套用實踐(第5~11章),不僅詳細講解了OSGi服務綱要規範和企業級規範中最常用的幾個子規範和服務的技術細節,還通過一個基於Equinox的BBS案例演示了Equinox的使用方法,最重要的是還通過源碼分析了Equinox關鍵功能的實現機制和原理。第四部分:最佳實踐(第12~14章),總結了大量關於OSGi的最佳實踐,包括從Bundle如何命名、模組劃分、依賴關係處理到保持OSGi動態性、管理程式啟動順序、使用API基線管理模組版本等各方面的實踐技巧,此外還介紹了Spring DM的原理以及如何在OSGi環節中進行程式測試。
作者介紹
周志明 資深Java技術專家,對JavaEE企業級套用開發、OSGi、Java虛擬機和工作流等都有深入的研究,並在大量的實踐中積累了豐富的經驗。尤其精通Java虛擬機,撰寫了大量與JVM相關的經典文章,被各大技術社區爭相轉載,是ITeye等技術社區公認的Java虛擬機方面的領袖人物之一,著有經典著作《深入理解Java虛擬機:JVM高級特性與最佳實踐》(2年內重印十數次,獲得業界多個圖書獎項),廣獲讀者好評。現任遠光軟體股份有限公司平台開發部經理兼平台架構師,先後參與過國家電網、南方電網等多個國家級大型ERP項目的平台架構工作,對軟體系統架構也有深刻的認識和體會。謝小明 資深Java技術專家,具有豐富的JavaEE企業級套用開發開發經驗,對OSGi、Spring、Hibernate等技術和框架有比較深入的研究和認識。喜歡鑽研運行與JVM之上的其他語言,如Scala和Clojure等。現任遠光軟體股份有限公司平台開發部平台架構師,先後參加與過國家電網、南方電網等多個國家級大型ERP項目的平台架構工作。
作品目錄
前言第一部分 走近OSGi
第1章 Java模組化之路 / 2
1.1 什麼是OSGi / 2
1.1.1 OSGi規範的演進 / 4
1.1.2 Java模組化規範之爭 / 7
1.2 為什麼使用OSGi / 11
1.2.1 OSGi能讓軟體開發變得更容易嗎 / 12
1.2.2 OSGi能讓系統變得更穩定嗎 / 13
1.2.3 OSGi能讓系統運行得更快嗎 / 14
1.2.4 OSGi能支撐企業級開發嗎 / 15
1.3 本章小結 / 16
第二部分 OSGi規範與原理
第2章 模組層規範與原理 / 18
2.1 OSGi規範概要 / 18
2.2 Bundle / 20
2.3 描述元數據 / 21
2.3.1 預定義標記 / 21
2.3.2 使用可視化工具 / 27
2.4 Bundle的組織與依賴 / 31
2.4.1 導出和導入Package / 31
2.4.2 約束規則與示例 / 38
2.4.3 校驗Bundle有效性 / 44
2.5 OSGi的類載入架構 / 45
2.5.1 父類載入器 / 46
2.5.2 Bundle類載入器 / 47
2.5.3 其他類載入器 / 49
2.5.4 類載入順序 / 50
2.6 定義執行環境 / 51
2.7 本地化 / 54
2.8 本章小結 / 55
第3章 生命周期層規範與原理 / 56
3.1 Bundle標識 / 56
3.2 Bundle狀態及轉換 / 57
3.2.1 安裝過程 / 59
3.2.2 解析過程 / 61
3.2.3 啟動過程 / 62
3.2.4 更新過程 / 63
3.2.5 停止過程 / 64
3.2.6 卸載過程 / 65
3.3 啟動級別 / 65
3.3.1 設定啟動級別 / 66
3.3.2 調整活動啟動級別 / 67
3.4 事件監聽 / 68
3.4.1 事件類型 / 69
3.4.2 事件分派 / 70
3.5 系統Bundle / 71
3.6 Bundle上下文 / 72
3.7 本章小結 / 73
第4章 服務層規範與原理 / 74
4.1 服務 / 74
4.2 OSGi服務示例 / 75
4.3 服務屬性 / 80
4.3.1 屬性過濾器 / 82
4.3.2 預定義屬性 / 83
4.3.3 修改屬性 / 84
4.4 服務工廠 / 85
4.5 服務跟蹤器 / 86
4.6 引用服務 / 89
4.7 釋放和註銷服務 / 91
4.8 服務層事件 / 91
4.8.1 事件類型 / 92
4.8.2 事件分派 / 92
4.8.3 ServiceRegistration對象的提前請求 / 93
4.9 遠程服務 / 94
4.9.1 準備遠程服務環境 / 94
4.9.2 遠程服務示例 / 96
4.9.3 遠程服務屬性 / 99
4.9.4 實現分析 / 100
4.10 服務鉤子 / 101
4.10.1 EventListenerHook / 101
4.10.2 FindHook / 101
4.10.3 ListenerHook / 102
4.10.4 服務鉤子示例 / 102
4.11 本章小結 / 105
第三部分 基於Equinox的OSGi套用與實踐
第5章 Equinox啟航 / 108
5.1 建立Equinox開發環境 / 109
5.1.1 建立運行環境 / 109
5.1.2 建立編譯及調試環境 / 110
5.1.3 建立開發環境 / 112
5.2 Equinox常用組件簡介 / 117
5.3 Equinox啟動器 / 119
5.4 使用代碼啟動Equinox / 124
5.5 本章小結 / 125
第6章 Equinox基礎套用與源碼解析 / 126
6.1 實踐項目—Neonat論壇 / 126
6.1.1 背景與需求 / 126
6.1.2 模組劃分 / 127
6.1.3 基礎資料模組 / 129
6.1.4 持久化模組 / 133
6.1.5 用戶互動模組 / 135
6.1.6 運行效果 / 140
6.2 Equinox源碼解析 / 142
6.2.1 OSGi容器啟動 / 142
6.2.2 Bundle狀態恢復 / 147
6.2.3 解析Bundle依賴關係 / 153
6.2.4 OSGi類載入器實現 / 157
6.3 本章小結 / 162
第7章 伺服器端OSGi / 163
7.1 OSGi與Web伺服器 / 163
7.2 HTTP Service規範簡介 / 166
7.2.1 服務目標 / 166
7.2.2 服務接口 / 168
7.2.3 資源映射規則 / 169
7.2.4 請求處理過程 / 171
7.3 實踐項目—Neonat論壇的Web模組 / 171
7.3.1 準備依賴項 / 172
7.3.2 使用HTTP Service / 174
7.3.3 實現Web互動功能 / 176
7.3.4 運行效果 / 178
7.4 HTTP Service源碼解析 / 180
7.4.1 BridgeServlet與OSGi容器啟動 / 180
7.4.2 BridgeServlet與HTTP請求委派 / 186
7.4.3 DelegateServlet實現原理 / 188
7.5 本章小結 / 192
第8章 用戶管理服務 / 193
8.1 User Admin服務規範簡介 / 193
8.1.1 服務目標與基礎概念 / 193
8.1.2 驗證用戶身份 / 195
8.1.3 驗證用戶許可權 / 196
8.1.4 User Admin事件 / 197
8.2 實踐項目—Neonat論壇用戶管理模組 / 198
8.2.1 需求與依賴項分析 / 198
8.2.2 用戶與用戶組的實現 / 200
8.2.3 頁面許可權 / 201
8.2.4 用戶登錄與身份驗證 / 202
8.3 User Admin源碼解析 / 206
8.3.1 用戶管理實現 / 206
8.3.2 外部服務使用實踐 / 208
8.4 本章小結 / 211
第9章 Preferences服務 / 212
9.1 Preferences服務規範簡介 / 212
9.1.1 服務目標 / 212
9.1.2 數據結構 / 214
9.1.3 屬性 / 215
9.1.4 並發處理 / 216
9.1.5 清理遺留數據 / 217
9.2 實踐項目—Neonat論壇持久化模組 / 217
9.2.1 編碼實現 / 217
9.2.2 模組熱切換 / 220
9.3 Preferences源碼解析 / 222
9.3.1 數據結構實現 / 224
9.3.2 屬性存取 / 228
9.3.3 後端存儲系統 / 229
9.4 本章小結 / 234
第10章 聲明式服務 / 235
10.1 聲明式服務規範簡介 / 236
10.1.1 服務目標 / 236
10.1.2 定義Component / 236
10.1.3 Component類型 / 237
10.1.4 Component生命周期 / 240
10.1.5 Component屬性 / 245
10.1.6 綁定與發布服務 / 245
10.1.7 激活與鈍化方法 / 252
10.1.8 Component配置總結 / 254
10.2 實踐項目—使用聲明式服務改造Neonat論壇 / 259
10.2.1 可視化編輯工具 / 259
10.2.2 DS容器管理 / 263
10.3 DS容器源碼解析 / 264
10.3.1 容器啟動 / 264
10.3.2 載入Bundle中的Component / 267
10.3.3 動態依賴解析 / 272
10.4 本章小結 / 274
第11章 Subsystems服務 / 276
11.1 服務目標 / 276
11.2 Subsystem格式 / 277
11.3 Subsystem元數據 / 278
11.3.1 SUBSYSTEM.MF標識 / 278
11.3.2 DEPLOYMENT.MF標識 / 281
11.4 Subsystem類型與共享策略 / 283
11.5 組織管理Subsystem / 285
11.6 Subsystem部署與依賴策略 / 289
11.7 Subsystem生命周期 / 291
11.7.1 安裝 / 292
11.7.2 解析 / 293
11.7.3 啟動 / 294
11.7.4 停止 / 294
11.7.5 卸載 / 295
11.8 本章小結 / 295
第四部分 最佳實踐
第12章 OSGi最佳實踐 / 298
12.1 Bundle相關名稱命名 / 298
12.2 Bundle劃分原則 / 300
12.2.1 恰如其分地分配Bundle粒度 / 300
12.2.2 分離OSGi代碼 / 300
12.2.3 分離接口和實現 / 300
12.3 依賴關係實踐 / 301
12.3.1 依賴分析工具 / 301
12.3.2 避免Require-Bundle / 303
12.3.3 最小化依賴 / 304
12.3.4 避免循環依賴 / 304
12.3.5 Equinox x-*依賴 / 305
12.4 Equinox專有類載入機制 / 306
12.4.1 Buddy Loading類載入機制 / 306
12.4.2 ClassLoaderDelegateHook類載入機制 / 307
12.5 Bundle生命周期實踐 / 309
12.5.1 啟動 / 309
12.5.2 停止 / 309
12.6 服務工廠的特殊性 / 309
12.7 處理非OSGi的JAR包 / 311
12.8 啟動順序實踐 / 313
12.8.1 避免啟動順序依賴 / 313
12.8.2 Start Level的使用 / 313
12.9 Fragment Bundle實踐 / 314
12.10 保持OSGi動態性 / 315
12.11 API Tools實踐 / 317
12.11.1 API Baselines / 317
12.11.2 API Tools 註解 / 319
12.11.3 API Version版本管理 / 322
12.11.4 二進制檔案不兼容 / 322
12.12 本章小結 / 322
第13章 Spring Dynamic Modules實踐 / 324
13.1 Spring DM入門 / 324
13.1.1 Spring DM項目簡介 / 324
13.1.2 安裝Spring DM / 325
13.1.3 簡單的Spring DM示例 / 326
13.1.4 Bundle和Spring上下文 / 331
13.1.5 <osgi:*>命名空間 / 333
13.2 Spring DM進階 / 337
13.2.1 Spring DM擴展配置 / 337
13.2.2 Web Extender / 344
13.2.3 Spring DM服務約束 / 345
13.2.4 在Spring上下文中使用BundleContext / 346
13.3 Spring DM企業套用 / 346
13.3.1 規劃OSGi組件 / 347
13.3.2 在Spring DM中使用JPA / 348
13.3.3 事務管理 / 353
13.3.4 OSGi企業規範中的JPA / 358
13.4 Spring DM和Blueprint / 359
13.5 本章小結 / 360
第14章 構建可測試的OSGi系統 / 361
14.1 單元測試的必要性 / 362
14.2 單元測試的重要性 / 363
14.3 可測試代碼的特徵 / 364
14.4 OSGi單元測試 / 365
14.4.1 如何組織測試代碼 / 366
14.4.2 如何進行OSGi單元測試 / 367
14.5 OSGi集成測試 / 373
14.5.1 Eclipse JUnit Plug-in Test / 374
14.5.2 Spring DM Test / 379
14.5.3 Pax Exam / 383
14.6 本章小結 / 384
附錄A Java類載入器簡介 / 385
附錄B Equinox控制台命令 / 392
附錄C OSGi子規範目錄 / 397
附錄D OSGi相關項目 / 399
附錄E Equinox啟動配置參數 / 401