• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Shuffy

            不斷的學習,不斷的思考,才能不斷的進步.Let's do better together!
            posts - 102, comments - 43, trackbacks - 0, articles - 19

            AOP的四種主要Java實現方式

            Posted on 2011-10-18 01:02 Shuffy 閱讀(1235) 評論(0)  編輯 收藏 引用 所屬分類: Java
             據統計,目前與AOP相關的項目已達近百種,而基于JavaAOP實現機制也有二十多種,以下所列舉的是商業上得到成熟應用的幾種基于JavaAOP的實現機制。

            AspectJ


            AspectJ是目前最完善的AOP語言,由AOP的首倡者Gregor Kiczales領導的一個小組提出并得到發展。AspectJ是對Java編程語言的擴展,通過增加了一些新的構造塊支持對橫切關注點的模塊化封裝,通過對源代碼級別的代碼混合實現織入,是一種典型的使用靜態織入的AOP實現機制。AspectJ提供了兩種橫切實現機制,一種稱為動態橫切(Dynamic Crosscutting),另一種稱為靜態橫切(Static Crosscutting)。


            動態橫切是指在程序執行的某一個明確的點上運行額外的,預先定義好的實現,是一種靜態實現機制,并非是動態的。為了實現動態橫切,AspectJ中引入了四個新的概念:連接點(Join Point),切入點(Pointcut),參考(Advice)和方面(Aspect)。連接點是明確定義的程序執行過程中的一個點,切入點則是指一組相關的連接點,參考定義了在連接點執行的額外實現,方面則是指對橫切關注點的模塊化封裝實現的單元,類似于AOP中的類,由切入點,參考與普通的Java成員聲明組成。如前所述,連接點是程序執行中明確定義的點,比如,類接受到方法調用時,方法調用時,屬性訪問時都是連接點的例子,在連接點處可以執行預定義的額外實現。而要指明在哪些連接點上執行,則需要定義切入點,切入點可以在程序運行時匹配特定的連接點,AspectJ中預定義了一系列標準切入點,包括方法與構造器的調用,接受調用,執行,域的getset訪問,異常處理,實例類型匹配,處于類或方法體中,控制流中,調用者調用方法,類型的初始化與靜態初始化,通過這些預定義切入點的組合可以實現自定義的、復雜的切入點。在編譯時,方面中的參考將被轉化為標準的方法,類代碼中匹配切入點的連接點將被轉化為一個靜態的標記點,然后,這些靜態的點將被對參考所轉化成的方法的調用所取代,由此完成兩種代碼的織入,最后對織入完成的代碼編譯為字節碼,即完成了整個編譯過程。目前,AspectJ即支持編譯前的預處理方式實現代碼的織入,也支持編譯后的字節碼操作。


            靜態橫切是指對已存在的類型定義引入新的方法,屬性等,與動態橫切不同,靜態橫切不改變類型的動態行為,而是改變其靜態結構,也即導入(Introduction)。通過在方面代碼中聲明方法,屬性,需要繼承的超類,接口等,在代碼織入時,可以改變應用此方面的類的定義。

            AspectWerkz


            AspectWerkz是一個動態的AOP框架,利用對字節碼的修改實現方面的織入,并使用Java虛擬機的動態替換字節碼的能力實現動態AOP的要求。AspectWerkz沒有擴展Java語言,方面、參考、切入點等均使用標準的Java構造塊,即類以及方法來實現,并使用XML文件定義這些構造塊,此外AspectWerkz還支持使用JavaDoc標記實現的運行期屬性定義。AspectWerkz采用了與AspectJ相似的連接點模型,只是支持的連接點種類少于AspectJ,參考的類型一致。


            AspectWerkz通過引入一個間接層,方面容器(Aspect Container)以及對字節碼的轉化,即代碼織入實現動態AOP的要求,方面容器管理部署好的類、方面代碼,并根據XML文件或JavaDoc注釋中定義的方面,參考,切入點等得到連接點處相關的方面信息,并在程序的執行中控制執行流程,在匹配的連接點處執行適當的參考。


            AspectWerkz通過類載入層次的適當位置攔截類載入從而實現字節碼的修飾。AspectWerkz提供了兩種織入模式實現AOP:靜態織入以及動態織入。靜態織入只在類載入時對字節碼作一次性的轉化,通過將類的方法實現移入AspectWerkz命名的方法中,將原方法中的代碼改寫,由方面容器調用適當的參考,并調用前述AspectWerkz添加的方法從而完成代碼的織入。導入則由混合類型(Mixin)實現,用于為類增加新的方法,混合類型是一種使用接口與實現類的方式模擬多重繼承的機制。AspectWerkz通過修改字節碼使被導入的類實現混合類型的接口,并在接口定義的方法中,將控制交給容器管理器,由它來完成對實現的調用。靜態織入可以在運行時動態的為切入點增加,刪除參考,可以引入新的參考,但是無法定義新的切入點,這需要動態織入。動態織入由兩階段織入完成,分別為類載入階段與激活階段。首先,在類載入時,按照靜態織入的方法,為需要實現動態織入的類的每個方法添加一個相應的空的方法,匹配連接點的方法除外。然后,在激活階段,原方法體中的代碼將被交換到類載入時新產生的方法中,原方法將實現靜態織入時相同的處理,從而方面容器控制流程。前述代碼交換是由熱交換(HotSwap)實現的,這是JVM提供的API。通過方面容器與織入模型,AspectWerkz提供了動態AOP的實現。


            SpringFramework


            SpringFramework是一個采用了反轉控制(Inversion of Control, IoC)策略的基于J2EE的輕量級應用框架。SpringFramework的核心是IoC容器,對于其它應用,如數據庫訪問,日志等,SpringFramework多使用現有的、成熟的框架。SpringFramework采用了模塊化的方式,各模塊可以共同使用,也可以單獨使用其中的一個模塊, SpringFramework的一個模塊提供了對動態AOP的支持,SpringFramework中提供的聲明式事務管理就是基于動態AOP的。


            SpringFrameworkAOP的實現基于動態代理(Dynamic Proxy), 動態代理源于代理模式,即通過接口實現對業務對象的訪問,但動態代理無需為每一個需代理的業務對象靜態的生成代理對象,只需提供需要代理的接口與代理實現,就可以在運行時動態的生成代理對象,代理對上述接口的訪問,同樣的機制也使用于對類的代理,使用類似于修飾者的模式,通過子類化實現。SpringFramework默認使用JDK提供的動態代理機制,此時,業務對象通過接口編程,若需要代理對類的訪問,則需要使用CGLIB,這是一個開源的動態代理實現。


            SpringFrameworkAOP實現不同于AspectJAspectWerkz,它不是完全的AOP實現,而是設計用于在應用服務器環境下實現AOP,與SpringFrameworkIoC容器配合使用。SpringFramework中參考,切入點與方面均由普通Java對象實現,其中連接點模型與AspectJ相同,只是遠不如AspectJ豐富,目前只提供對方法調用的攔截。有4種類型的參考,分別為方法調用時,之前,返回時與拋出異常時,通過實現SpringFramework的參考接口可以自定義參考類型。在SpringFramework中,方面稱為Advisor,是一個包含參考與切入點的Java類。像其它由IoC容器管理的組件一樣,參考,切入點與方面也由IoC容器管理 ,由XML配置文件定義。配置的內容包括業務對象的接口與實現,自定義的或由SpringFramework提供的切入點與參考類,或使用Adviser類取代單獨的切入點與參考類。在運行時,通過IoC容器進行名稱查找,就可以由容器使用代理機制自動產生代理對象,并在符合切入點定義的連接點處執行參考。SpringFramework除自身實現的AOP框架外,還在尋求與其它AOP實現機制的整合,目前已經實現了與AspectJ的整合,以利用AspectJ豐富的切入點語法,并利用AspectJ的方面實現。

            JBoss


            JBoss是一個開源的符合J2EE規范的應用服務器,作為J2EE規范的補充,Jboss中引入了AOP框架,為普通Java類提供了J2EE服務,而無需遵循EJB規范。Jboss通過類載入時,使用Javassist對字節碼操作實現動態AOP框架,Javassist是一個開源的編輯字節碼的類庫。


            Jboss中參考,切入點與方面也由普通Java對象實現,并使用XML文件配置。Jboss的連接點模型與AspectJ略有不同,提供了一系列預定義的切入點,包括類匹配,方法調用,構造器調用,域訪問,特定的調用與被調用關系。通過這些切入點的邏輯運算,可以實現更為復雜的切入點。方面為Java類,參考是其中的一個方法,方面中不含切入點,方面主要為各種攔截器(Interceptor),攔截器即為只含一個參考的方面,單一連接點上可由多個攔截器形成攔截器鏈,攔截器執行額外的操作。對方法的攔截由Advisor類管理,在連接點依次調用攔截器,并最終調用被邏輯的方法。而關于切入點,參考已及方面的信息由AspectManager管理。此外,Jboss提供對元數據的支持,用于為類,方法,構造器以及域添加額外的屬性,并可在運行期訪問。


            為實現攔截,Jboss需要修改類的字節碼,大致過程如下。XML配置文件中關于切入點,攔截器,元數據以及混合類的信息在應用程序部署時被讀入、解析,并生成相應的對象,這些信息與實例化的對象由AspectManager管理。在需要混入方面代碼的類載入時,AspectManager將創建Advisor類,將方面相關信息傳遞給它,并對類的字節碼進行修改,之后將修改過的字節碼交給類載入器完成類的裝載。字節碼的修改主要是對被載入的類添加一系列方法用于代理那些匹配連接點的方法調用,構造器調用,域訪問以及方法導入,轉為對Advisor類相應方法的調用。類中各方法將重命名,保留原方法體,并添加一個與原方法同名的方法,在這個方法中調用那些代理方法,用來將調用代理給Advisor類,或調用重命名的原方法。對于域訪問,分別添加兩個方法,對應于讀與寫操作,將域訪問代理至Advisor類,在訪問這個域的類中,則需將對域的訪問轉換為對上述方法的調用。對于構造器調用,則添加一個方法,將調用代理至Advisor類,并對構造對象的類的構造代碼作相應轉換。對于導入,被導入的類中將添加一個混合類實現的引用,并添加混合類接口中的方法,將對混合類方法的調用代理至Advisor類,并最終調用混合類的實現。相關類載入后,初始化Advisor類,填入攔截器鏈,以完成整個處理過程。

            原文鏈接:http://blog.csdn.net/mimicimim/article/details/1770348
            国产国产成人精品久久| 奇米综合四色77777久久| 久久久91人妻无码精品蜜桃HD| 国产精品欧美久久久久无广告| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久久WWW成人| 亚洲AV日韩精品久久久久久久| 国产精品免费看久久久| 综合久久一区二区三区 | 99精品国产综合久久久久五月天| 日产精品99久久久久久| 精品综合久久久久久88小说 | 久久无码AV一区二区三区| 国产成人久久精品一区二区三区| 国产农村妇女毛片精品久久| 久久午夜无码鲁丝片秋霞 | 浪潮AV色综合久久天堂| 91精品久久久久久无码| 久久精品国产久精国产思思| 人人狠狠综合88综合久久| 精品亚洲综合久久中文字幕| 老男人久久青草av高清| 久久久久久久亚洲精品| 国产99久久久久久免费看 | 久久久久亚洲AV成人网| 精品国产91久久久久久久 | 中文字幕精品久久| 国产亚洲精久久久久久无码AV| 久久久久久久久无码精品亚洲日韩 | 乱亲女H秽乱长久久久| 亚洲欧美精品一区久久中文字幕 | 男女久久久国产一区二区三区| 久久综合久久伊人| 久久夜色精品国产亚洲av| 久久久久久国产a免费观看不卡| 国产成人久久激情91| 国产精品一久久香蕉国产线看观看| 伊人久久精品无码二区麻豆| 久久久久久曰本AV免费免费| 亚洲精品tv久久久久| 波多野结衣久久|