為什麼要區分JEE容器和JEE應用系統?
我們知道JEE應用系統只有部署在JEE容器中才能運行那麼為什麼劃分為JEE容器和JEE應用系統? 通過對JEE容器運行機制的分析我們可以發現實際上JEE容器分離了一般應用系統的一些通用功能例如事務機制安全機制以及對象池或線程池等性能優化機制
這些功能機制是每個應用系統幾乎都需要的因此可以從具體應用系統中分離出來形成一個通用的框架平台而且這些功能機制的設計開發有一定難度同時運行的穩定性和快速性都非常重要必須經過長時間調試和運行經驗積累而成因此形成了專門的JEE容器服務器產品如Tomcat JBossWebsphereWebLogic等
從JEE系統劃分為JEE容器和JEE應用系統兩個方面我們已經看到一種分散關注的思路(separation of concerns)
分散關注
將通用需求功能從不相關類之中分離出來;同時能夠使得很多類共享一個行為一旦行為發生變化不必修改很多類只要修改這個行為就可以
AOP就是這種實現分散關注的編程方法它將“關注”封裝在“方面”中
AOP是什麼?
AOP是OOP的延續是Aspect Oriented Programming的縮寫意思是面向方面編程AOP實際是GoF設計模式的延續設計模式孜孜不倦追求的是調用者和被調用者之間的解耦AOP可以說也是這種目標的一種實現
舉例假設有在一個應用系統中有一個共享的數據必須被並發同時訪問首先將這個數據封裝在數據對象中稱為Data Class同時將有多個訪問類專門用於在同一時刻訪問這同一個數據對象
為了完成上述並發訪問同一資源的功能需要引入鎖Lock的概念也就是說某個時刻當有一個訪問類訪問這個數據對象時這個數據對象必須上鎖Locked用完後就立即解鎖unLocked再供其它訪問類訪問
使用傳統的編程習慣我們會創建一個抽象類所有的訪問類繼承這個抽象父類如下
abstract class Worker{
abstract void locked();
abstract void accessDataObject();
abstract void unlocked();
}
缺點
accessDataObject()方法需要有“鎖”狀態之類的相關代碼Java只提供了單繼承因此具體訪問類只能繼承這個父類如果具體訪問類還要繼承其它父類比如另外一個如Worker的父類將無法方便實現重用被打折扣具體訪問類因為也包含“鎖”狀態之類的相關代碼只能被重用在相關有“鎖”的場合重用范圍很窄
仔細研究這個應用的“鎖”它其實有下列特性
“鎖”功能不是具體訪問類的首要或主要功能訪問類主要功能是訪問數據對象例如讀取數據或更改動作
“鎖”行為其實是和具體訪問類的主要功能可以獨立區分開來的
“鎖”功能其實是這個系統的一個縱向切面涉及許多類許多類的方法
因此一個新的程序結構應該是關注系統的縱向切面例如這個應用的“鎖”功能這個新的程序結構就是aspect(方面)在這個應用中“鎖”方面(aspect)應該有以下職責
提供一些必備的功能對被訪問對象實現加鎖或解鎖功能以保證所有在修改數據對象的操作之前能夠調用lock()加鎖在它使用完成後調用unlock()解鎖
AOP應用范圍
很明顯AOP非常適合開發JEE容器服務器目前JBoss 正是使用AOP框架進行開發具體功能如下
Authentication 權限
Caching 緩存
Context passing 內容傳遞
Error handling 錯誤處理
Lazy loading 懶加載
Debugging 調試
logging tracing profiling and monitoring
記錄跟蹤 優化 校准
Performance optimization 性能優化
Persistence 持久化
Resource pooling 資源池
Synchronization 同步
Transactions 事務
AOP有必要嗎?
當然上述應用范例在沒有使用AOP情況下也得到了解決例如JBoss XXX也提供了上述應用功能但是沒有使用AOP
但是使用AOP可以讓我們從一個更高的抽象概念來理解軟件系統AOP也許提供一種有價值的工具可以這麼說因為使用AOP結構現在JBoss 的源碼要比JBoss X容易理解多了這對於一個大型復雜系統來說是非常重要的
從另外一個方面說好像不是所有的人都需要關心AOP它可能是一種架構設計的選擇如果選擇JEE系統AOP關注的上述通用方面都已經被JEE容器實現了JEE應用系統開發者可能需要更多地關注行業應用方面aspect
AOP具體實現
AOP是一個概念並沒有設定具體語言的實現它能克服那些只有單繼承特性語言的缺點(如Java)目前AOP具體實現有以下幾個項目
AspectJ (TM) 創建於Xerox PARC 有近十年歷史技術成熟
缺點過於復雜;破壞封裝;需要專門的Java編譯器
動態AOP使用JDK的動態代理API或字節碼Bytecode處理技術
基於動態代理API的具體項目有
JBoss JBoss 服務器
nanning
基於字節碼的項目有
aspectwerkz
spring
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19961.html