Oo緣來是你oO


          posts - 120,comments - 125,trackbacks - 0
          為什么要區(qū)分J2EE容器和J2EE應(yīng)用系統(tǒng)?

            我們知道,J2EE應(yīng)用系統(tǒng)只有部署在J2EE容器中才能運行,那么為什么劃分為J2EE容器和J2EE應(yīng)用系統(tǒng)? 通過對J2EE容器運
          行機 制的分析,我們可以發(fā)現(xiàn):實際上J2EE容器分離了一般應(yīng)用系統(tǒng)的一些通用功能,例如事務(wù)機制、安全機制以及對象池或線程池等性能優(yōu)化機制。

          這些功能機制是每個應(yīng)用系統(tǒng)幾乎都需要的,因此可以從具體應(yīng)用系統(tǒng)中分離出來,形成一個通用的框架平臺,而且,這些功能機制的設(shè)計開發(fā)有一定難度,同時運行的穩(wěn)定性和快速性都非常重要,必須經(jīng)過長時間調(diào)試和運行經(jīng)驗積累而成,因此,形成了專門的J2EE容器服務(wù)器產(chǎn)品,如Tomcat JBoss、Websphere、WebLogic等。

            從J2EE系統(tǒng)劃分為J2EE容器和J2EE應(yīng)用系統(tǒng)兩個方面,我們已經(jīng)看到一種分散關(guān)注的思路(separation of concerns)。

            分散關(guān)注

            將通用需求功能從不相關(guān)類之中分離出來;同時,能夠使得很多類共享一個行為,一旦行為發(fā)生變化,不必修改很多類,只要修改這個行為就可以。

            AOP就是這種實現(xiàn)分散關(guān)注的編程方法,它將“關(guān)注”封裝在“方面”中。

            AOP是什么?

            AOP是OOP的延續(xù),是Aspect Oriented Programming的縮寫,意思是
          面向方面編程 。AOP實際是GoF設(shè)計模式的延續(xù),設(shè)計模式孜孜不倦追求的是調(diào)用者和被調(diào)用者之間的解耦,AOP可以說也是這種目標的一種實現(xiàn)。

            舉例:假設(shè)有在一個應(yīng)用系統(tǒng)中,有一個共享的數(shù)據(jù)必須被并發(fā)同時訪問,首先,將這個數(shù)據(jù)封裝在數(shù)據(jù)對象中,稱為Data Class,同時,將有多個訪問類,專門用于在同一時刻訪問這同一個數(shù)據(jù)對象。

            為了完成上述并發(fā)訪問同一資源的功能,需要引入鎖Lock的概念,也就是說,某個時刻,當有一個訪問類訪問這個數(shù)據(jù)對象時,這個數(shù)據(jù)對象必須上鎖Locked,用完后就立即
          解鎖 unLocked,再供其它訪問類訪問。

            使用傳統(tǒng)的編程習慣,我們會創(chuàng)建一個
          抽象類 ,所有的訪問類繼承這個抽象父類,如下:

          abstract class Worker{

            abstract void locked();
            abstract void accessDataObject();
            abstract void unlocked();

          }

            缺點:

            accessDataObject()方法需要有“鎖”狀態(tài)之類的相關(guān)代碼。Java只提供了單繼承,因此具體訪問類只能繼承這個父類,如果具體訪問類還要繼承其它父類,比如另外一個如Worker的父類,將無法方便實現(xiàn)。重用被打折扣,具體訪問類因為也包含“鎖”狀態(tài)之類的相關(guān)代碼,只能被重用在相關(guān)有“鎖”的場合,重用范圍很窄。

            仔細研究這個應(yīng)用的“鎖”,它其實有下列特性:

            “鎖”功能不是具體訪問類的首要或主要功能,訪問類主要功能是訪問數(shù)據(jù)對象,例如讀取數(shù)據(jù)或更改動作。
            
            “鎖”行為其實是和具體訪問類的主要功能可以獨立、區(qū)分開來的。

            “鎖”功能其實是這個系統(tǒng)的一個縱向切面,涉及許多類、許多類的方法。如下圖:

            因此,一個新的程序結(jié)構(gòu)應(yīng)該是關(guān)注系統(tǒng)的縱向切面,例如這個應(yīng)用的“鎖”功能,這個新的程序結(jié)構(gòu)就是aspect(方面)在這個應(yīng)用中,“鎖”方面(aspect)應(yīng)該有以下職責:

            提供一些必備的功能,對被訪問對象實現(xiàn)
          加鎖 或解鎖功能。以保證所有在修改數(shù)據(jù)對象的操作之前能夠調(diào)用lock()加鎖,在它使用完成后,調(diào)用unlock()解鎖。

            AOP有必要嗎?

            當然,上述應(yīng)用范例在沒有使用AOP情況下,也得到了解決,例如JBoss 3.XXX也提供了上述應(yīng)用功能,但是沒有使用AOP。

            但是,使用AOP可以讓我們從一個更高的抽象概念來理解軟件系統(tǒng),AOP也許提供一種有價值的工具。可以這么說:因為使用AOP結(jié)構(gòu),現(xiàn)在JBoss 4.0的源碼要比JBoss 3.X容易理解多了,這對于一個大型復(fù)雜系統(tǒng)來說是非常重要的。

            從另外一個方面說,好像不是所有的人都需要關(guān)心AOP,它可能是一種架構(gòu)設(shè)計的選擇,如果選擇J2EE系統(tǒng),AOP關(guān)注的上述通用方面都已經(jīng)被J2EE容器實現(xiàn)了,J2EE應(yīng)用系統(tǒng)開發(fā)者可能需要更多地關(guān)注行業(yè)應(yīng)用方面aspect。

            AOP具體實現(xiàn)

            AOP是一個概念,并沒有設(shè)定具體語言的實現(xiàn),它能克服那些只有單繼承特性語言的缺點(如Java),目前AOP具體實現(xiàn)有以下幾個項目:

            AspectJ (TM): 創(chuàng)建于Xerox PARC. 有近十年歷史,技術(shù)成熟。

            缺點:過于復(fù)雜;破壞封裝;需要專門的Java編譯器。

            動態(tài)AOP:使用JDK的動態(tài)代理API或字節(jié)碼Bytecode處理技術(shù)。

            基于動態(tài)代理API的具體項目有:

            JBoss 4.0 JBoss 4.0服務(wù)器
            
            基于字節(jié)碼的項目有:

            aspectwerkz 
            spring


          來源:http://dev.yesky.com/349/2155349.shtml


          馬嘉楠
          jianan.ma@gmail.com

          posted on 2006-08-28 17:38 馬嘉楠 閱讀(305) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 成安县| 安溪县| 麻城市| 广南县| 女性| 南溪县| 绥滨县| 宜良县| 石景山区| 湘潭市| 石柱| 伊金霍洛旗| 繁峙县| 垦利县| 枣庄市| 东至县| 潜江市| 安陆市| 古田县| 大安市| 灵石县| 伽师县| 安乡县| 北宁市| 洛川县| 永修县| 仪征市| 仲巴县| 南昌市| 蒲城县| 濮阳市| 阿克陶县| 南充市| 五台县| 甘洛县| 山西省| 宁都县| 揭阳市| 景洪市| 富平县| 富蕴县|