宣傳語
本書幫您圓滿實現 快速遞交高質量軟體產品之夢!
內容簡介
《Java組件設計》主要講解企業套用系統中核心組件的設計原則與最佳實踐,澄清設計模式、數據結構、多執行緒、接口設計等多個高階技術領域中“流行”的認知誤區,通過大量的組件實例分析,為讀者精彩地講解組件設計這一最具技術含量的領域需要考慮的核心問題、設計方案與最佳實踐。本書主要定位於軟體架構師、設計師、高級開發人員在企業實際套用開發中的參考讀物,也適合大專院校相關專業作為教材輔導圖書閱讀。
設計,決定了軟體質量!
組件化設計和構建軟體系統,是實現快速發布高質量軟體產品之夢的最佳實踐!
組件設計,凝聚了需求分析、面向對象、設計模式、數據結構、多執行緒等一系列高階領域的核心精髓!
Java語言,是網際網路上的卓越語言,從誕生的那一天開始,就被很多軟體工程師所青睞,不斷在世界的每個角落開花結果,套用日益廣泛。
Java開源世界,如火如荼地發展,無數的框架、組件如雨後春筍般湧現,極大地推進了Java技術在各個領域的商業套用。
然而,由於設計者的眼界、經驗和水平等的限制,Java開源框架、組件參差不齊,優秀者並不多見。在企業軟體開發中,Java往往成了臃腫、笨拙、低效等的代名詞。功能最簡單的Java組件也要幾十、上百個類檔案,使用組件需要引入的Jar檔案少則幾兆位元組,多則幾十兆、上百兆位元組。因此,所謂鼓吹的輕量級組件,不過是個噱頭而已。
筆者從事企業軟體開發十餘載,專注平台和組件開發領域,深知組件設計與開發過程的“高處不勝寒”。因此,在本書中,筆者將自己對組件技術的認識和心得進行總結和提煉,為讀者奉上一份Java組件設計領域的精彩技術大餐。
本書定位
本書面向軟體架構師、設計師、高級開發人員,講解企業套用中核心組件的設計原則與最佳實踐。
本書將澄清設計模式、數據結構、多執行緒、接口設計等多個高階技術領域中“流行”的認知誤區,通過大量的組件實例分析,為讀者精彩講解組件設計這一最具技術含量的領域需要考慮的核心問題、設計方案與最佳實踐。
本書的內容
這本書主要涵蓋三部分的內容:
第1篇,主要講解了應用程式的架構、組件的定義和組件核心設計原則。這些原則,都是在大量的企業軟體實踐中濃縮提煉的精華。
第2篇,對Java語言的高級主題進行了詳盡的闡述,作為組件實戰的必需必備基礎功力。
第3篇,對企業套用的核心組件,進行需求分析、設計和實現。核心組件包括:
? 第4章,配置組件 ? 第7章,資料庫訪問組件
? 第5章,Socket 通信組件 ? 第8章,JSON轉換器
? 第6章,日誌組件 ? 第9章,許可權組件
特别致謝
衷心感謝周堅先生,在華為公司期間對我無私的指導,使我有幸步入設計領域的高級殿堂!
衷心感謝我的父親、母親和兄弟姐妹,是你們的關懷照顧和言傳身教,讓我懂得人生的意義!
衷心感謝我的妻子,默默忍受我長期的熬夜,不斷給我關心、支持和鼓勵!
衷心感謝我的兒子,給我帶來無盡的歡樂!
衷心感謝在我的生活、工作中,幫助過我的每一個人!
孔德生
2008年12月
目錄
第1篇 組件設計總括
第1章 組件設計概述 2
1.1 套用軟體的總體架構 2
1.2 組件定義及與其相關概念的澄清 4
1.3 總結 7
第2章 組件設計原則 8
2.1 組件定位:精準地解決共性問題 10
2.2 組件設計:無配置檔案 11
2.3 組件設計:與使用者概念一致 12
2.4 組件設計:業務無關的中立性 13
2.5 組件設計實現:對使用環境無假設 13
2.6 組件設計實現:單類設計和實現 14
2.7 總結 14
第2篇 組件設計的基礎知識
第3章 預備知識 16
3.1 Java語法深入講解 16
3.1.1 static 16
3.1.2 嵌套類 18
3.1.3 靜態嵌套類 20
3.2 反射 21
3.3 數據結構 23
3.3.1 ArrayList 23
3.3.2 LinkedList 24
3.3.3 HashSet 24
3.3.4 HashMap 25
3.4 泛型 26
3.4.1 泛型簡介 26
3.4.2 泛型套用在接口上 30
3.4.3 泛型套用在類上 30
3.4.4 泛型套用在方法上 31
3.4.5 限制泛型的可用類型 31
3.4.6 通配符泛型 34
3.4.7 泛型深入 36
3.5 執行緒 42
3.5.1 執行緒基礎 42
3.5.2 多執行緒同步 46
3.5.3 執行緒的阻塞 50
3.5.4 守護執行緒 52
3.5.5 多執行緒範例 52
第3篇 組件設計
第4章 配置組件 61
4.1 配置檔案格式 61
4.2 DTD,還是Schema 64
4.3 接口設計 68
4.3.1 設計思路 68
4.3.2 複合元素映射 69
4.3.3 接口設計 73
4.3.4 接口重構 78
4.4 接口實現 85
4.4.1 主要實現結構 85
4.4.2 DOM根節點解析 86
4.4.3 XML數據設定為對象屬性 87
4.4.4 補充說明 92
4.5 總結 92
第5章 Socket通信組件 93
5.1 使用場景 93
5.2 需求分析 93
5.2.1 系統內,還是系統間 94
5.2.2 TCP,還是UDP 94
5.2.3 點對點,還是廣播 95
5.2.4 單連線,還是多連線 95
5.2.5 安全問題 96
5.2.6 包邊界問題 96
5.2.7 連線管理 97
5.3 客戶端接口設計 99
5.3.1 設計原則 99
5.3.2 配置接口 100
5.3.3 功能接口 101
5.3.4 事件通知接口 101
5.4 客戶端技術實現 104
5.4.1 技術實現選型 104
5.4.2 配置接口實現 104
5.4.3 功能接口實現 104
5.5 服務端接口設計 113
5.5.1 設計原則 113
5.5.2 配置接口 114
5.5.3 功能接口 115
5.5.4 事件通知接口 116
5.6 服務端技術實現 118
5.6.1 技術實現選型 118
5.6.2 配置接口實現 119
5.6.3 功能接口實現 120
5.7 總結 133
第6章 日誌組件 134
6.1 使用場景 134
6.2 需求分析 137
6.2.1 單例,或多例 137
6.2.2 異步,還是同步 137
6.2.3 單執行緒,還是多執行緒 137
6.2.4 集中監控 138
6.2.5 線上修改配置 138
6.2.6 日誌格式 139
6.2.7 日誌內容 139
6.2.8 容錯考慮 140
6.3 接口設計 141
6.3.1 核心設計要點 141
6.3.2 配置接口設計 141
6.3.3 功能接口設計 142
6.3.4 日誌轉換接口 144
6.4 接口實現 145
6.4.1 技術選型 145
6.4.2 配置接口實現 145
6.4.3 功能接口實現 148
6.4.4 日誌轉換接口實現 153
6.5 總結 153
第7章 資料庫訪問組件 154
7.1 需求分析 155
7.1.1 資料庫類型 155
7.1.2 資料庫連線 155
7.1.3 單實例,還是多實例 156
7.1.4 ORM,還是SQL 156
7.1.5 什麼樣的結果集 156
7.1.6 結果集分頁、合併 157
7.1.7 存儲過程 157
7.1.8 對象的直接數據操作 158
7.1.9 事務 159
7.1.10 快取 159
7.2 DBAccess接口設計 160
7.2.1 設計思路 160
7.2.2 配置接口設計 163
7.2.3 連線管理 164
7.2.4 SQL 接口設計 166
7.2.5 批操作接口 169
7.2.6 存儲過程接口設計 169
7.2.7 事務接口 178
7.2.8 結果集轉換為對象 179
7.2.9 對象的直接資料庫操作 180
7.2.10 接口匯總 181
7.3 DBMonitor設計 186
7.4 數據對象映射規則設計 189
7.4.1 規則表示法 189
7.4.2 定義Annotation 190
7.4.3 代碼生成工具 193
7.5 DataSet 設計 199
7.5.1 基本信息 200
7.5.2 數據的隨機訪問 200
7.5.3 列值讀取 201
7.5.4 數據的增、刪、改 202
7.5.5 數據集的分割、合併 203
7.5.6 DataSetMetaData 204
7.5.7 DataSet接口匯總 205
7.6 DBAccess接口實現 207
7.6.1 配置接口實現 207
7.6.2 連線管理實現 208
7.6.3 事務接口實現 214
7.6.4 SQL接口實現 216
7.6.5 批操作接口實現 222
7.6.6 存儲過程接口實現 223
7.6.7 數據集轉換為對象實現 229
7.6.8 對象的直接資料庫操作實現 235
7.7 總結 237
第8章 JSON轉換器 238
8.1 引言 238
8.1.1 傳統Web套用 238
8.1.2 Ajax套用 239
8.1.3 數據規則 241
8.2 需求分析 243
8.2.1 需求場景 243
8.2.2 核心功能 244
8.3 接口設計 247
8.3.1 設計原則 247
8.3.2 JSON->Java 248
8.3.3 Java->JSON 248
8.3.4 接口匯總 249
8.4 接口實現 249
8.4.1 json2Obj 實現 249
8.4.2 obj2Json 實現 254
8.5 總結 257
第9章 許可權組件 258
9.1 引言 258
9.2 需求分析 258
9.2.1 套用場景 258
9.2.2 許可權分類 260
9.2.3 角色 265
9.2.4 組織結構 266
9.2.5 需求匯總 266
9.3 接口設計 267
9.3.1 標識用戶 268
9.3.2 獲得發起請求的用戶 268
9.3.3 攔截HTTP請求 270
9.3.4 許可權組件和套用系統之間訪問 270
9.3.5 套用系統的許可權定義 273
9.3.6 套用系統調用許可權組件 282
9.3.7 用戶許可權變更 282
9.3.8 Session逾時失效 283
9.3.9 AuthFilter接口匯總 285
9.3.10 AuthFilterImpl實現原型 286
9.3.11 部署配置 287
9.4 接口實現 288
9.4.1 實現思路 288
9.4.2 私有成員變數 288
9.4.3 init 方法實現 290
9.4.4 doFilter方法實現 293
9.4.5 canAccess方法實現 298
9.4.6 reloadRoleAuths方法實現 298
9.4.7 sessionDestroy方法實現 300
9.5 許可權套用示例 301
9.5.1 系統簡介 301
9.5.2 運行示例 302
9.5.3 實現介紹 305
9.6 總結 308
重點關注
共性的業務問題,是組件的產生來源。 10
技術與業務對齊,這是組件設計的第一位重要原則。 11
最簡單的組件,就是一個類。 14
高內聚!高內聚!單類組件,簡單到極致! 14
本質上講,static關鍵字聲明了一個全局變數。 16
在泛型代碼中,根本就沒有參數化類型的信息。 39
發布函式的原型相對穩定,不會頻繁發生修改。 76
從接口上看,只有一個Static方法,沒有任何Get或Set方法,因此不滿足IOC容器的規範,無法被放入IOC容器中,因此也無法與其他組件進行基於IOC容器的集成。這可是個大問題!! 83
因此,使用IOC容器作為物理部署、實施的配置方式,是不合適的。這裡編寫的配置組件,是用於部署實施的有力武器! 83
獲取滿足條件的Key集合,遍歷Key集合,取出每個Key,判斷Key是否是下面三種狀態之一:acceptable,readable,writable,從而對應地進行接收連線、數據讀取、傳送數據的操作。 127
大量的軟體開發實踐證明,進行複雜數據操作的套用系統中,存儲過程是解決問題的最有效方案。 158
應用程式的開發者,不需要編寫太多類,就可以將結果集轉換為對象,獲得類似ORM框架的功能。最理想的情況就是一個類也不增加。 179
作為組件設計者,應該讓組件的使用者做且僅做他們必須做的事情,摒棄任何不必要、煩瑣、無意義的環節。 189
這種情況下,如何實現互相之間的訪問,就成了一個難題! 271
大多數Web套用,使用Spring作為IOC容器來實例化、配置各種後台組件。而Spring自身在Deployment Descriptor中是作為一個Listener被Web Container實例化的。Listener 的初始化過程,早於Filter的初始化過程,因此當許可權組件開始被Web Container初始化時,Spring IOC容器和IOC容器內的各種後台組件都已經初始化完畢。這樣,在許可權組件的初始化參數中,配置一個類名,應用程式提供這個類的實現,而許可權組件動態實例化這個類,通過這個類的實例作為橋樑,獲得應用程式實例的訪問,這種方式是可行的。 271
只有角色產生了變化,才需要許可權組件更新內部的許可權數據。而用戶變化、用戶許可權、用戶角色變化等,都不需要許可權組件更新內部的許可權數據。 282