青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Shuffy

不斷的學(xué)習(xí),不斷的思考,才能不斷的進(jìn)步.Let's do better together!
posts - 102, comments - 43, trackbacks - 0, articles - 19

AOP的四種主要Java實(shí)現(xiàn)方式

Posted on 2011-10-18 01:02 Shuffy 閱讀(1255) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Java
 據(jù)統(tǒng)計(jì),目前與AOP相關(guān)的項(xiàng)目已達(dá)近百種,而基于JavaAOP實(shí)現(xiàn)機(jī)制也有二十多種,以下所列舉的是商業(yè)上得到成熟應(yīng)用的幾種基于JavaAOP的實(shí)現(xiàn)機(jī)制。

AspectJ


AspectJ是目前最完善的AOP語(yǔ)言,由AOP的首倡者Gregor Kiczales領(lǐng)導(dǎo)的一個(gè)小組提出并得到發(fā)展。AspectJ是對(duì)Java編程語(yǔ)言的擴(kuò)展,通過(guò)增加了一些新的構(gòu)造塊支持對(duì)橫切關(guān)注點(diǎn)的模塊化封裝,通過(guò)對(duì)源代碼級(jí)別的代碼混合實(shí)現(xiàn)織入,是一種典型的使用靜態(tài)織入的AOP實(shí)現(xiàn)機(jī)制。AspectJ提供了兩種橫切實(shí)現(xiàn)機(jī)制,一種稱為動(dòng)態(tài)橫切(Dynamic Crosscutting),另一種稱為靜態(tài)橫切(Static Crosscutting)。


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


靜態(tài)橫切是指對(duì)已存在的類型定義引入新的方法,屬性等,與動(dòng)態(tài)橫切不同,靜態(tài)橫切不改變類型的動(dòng)態(tài)行為,而是改變其靜態(tài)結(jié)構(gòu),也即導(dǎo)入(Introduction)。通過(guò)在方面代碼中聲明方法,屬性,需要繼承的超類,接口等,在代碼織入時(shí),可以改變應(yīng)用此方面的類的定義。

AspectWerkz


AspectWerkz是一個(gè)動(dòng)態(tài)的AOP框架,利用對(duì)字節(jié)碼的修改實(shí)現(xiàn)方面的織入,并使用Java虛擬機(jī)的動(dòng)態(tài)替換字節(jié)碼的能力實(shí)現(xiàn)動(dòng)態(tài)AOP的要求。AspectWerkz沒(méi)有擴(kuò)展Java語(yǔ)言,方面、參考、切入點(diǎn)等均使用標(biāo)準(zhǔn)的Java構(gòu)造塊,即類以及方法來(lái)實(shí)現(xiàn),并使用XML文件定義這些構(gòu)造塊,此外AspectWerkz還支持使用JavaDoc標(biāo)記實(shí)現(xiàn)的運(yùn)行期屬性定義。AspectWerkz采用了與AspectJ相似的連接點(diǎn)模型,只是支持的連接點(diǎn)種類少于AspectJ,參考的類型一致。


AspectWerkz通過(guò)引入一個(gè)間接層,方面容器(Aspect Container)以及對(duì)字節(jié)碼的轉(zhuǎn)化,即代碼織入實(shí)現(xiàn)動(dòng)態(tài)AOP的要求,方面容器管理部署好的類、方面代碼,并根據(jù)XML文件或JavaDoc注釋中定義的方面,參考,切入點(diǎn)等得到連接點(diǎn)處相關(guān)的方面信息,并在程序的執(zhí)行中控制執(zhí)行流程,在匹配的連接點(diǎn)處執(zhí)行適當(dāng)?shù)膮⒖肌?/span>


AspectWerkz通過(guò)類載入層次的適當(dāng)位置攔截類載入從而實(shí)現(xiàn)字節(jié)碼的修飾。AspectWerkz提供了兩種織入模式實(shí)現(xiàn)AOP:靜態(tài)織入以及動(dòng)態(tài)織入。靜態(tài)織入只在類載入時(shí)對(duì)字節(jié)碼作一次性的轉(zhuǎn)化,通過(guò)將類的方法實(shí)現(xiàn)移入AspectWerkz命名的方法中,將原方法中的代碼改寫(xiě),由方面容器調(diào)用適當(dāng)?shù)膮⒖迹⒄{(diào)用前述AspectWerkz添加的方法從而完成代碼的織入。導(dǎo)入則由混合類型(Mixin)實(shí)現(xiàn),用于為類增加新的方法,混合類型是一種使用接口與實(shí)現(xiàn)類的方式模擬多重繼承的機(jī)制。AspectWerkz通過(guò)修改字節(jié)碼使被導(dǎo)入的類實(shí)現(xiàn)混合類型的接口,并在接口定義的方法中,將控制交給容器管理器,由它來(lái)完成對(duì)實(shí)現(xiàn)的調(diào)用。靜態(tài)織入可以在運(yùn)行時(shí)動(dòng)態(tài)的為切入點(diǎn)增加,刪除參考,可以引入新的參考,但是無(wú)法定義新的切入點(diǎn),這需要?jiǎng)討B(tài)織入。動(dòng)態(tài)織入由兩階段織入完成,分別為類載入階段與激活階段。首先,在類載入時(shí),按照靜態(tài)織入的方法,為需要實(shí)現(xiàn)動(dòng)態(tài)織入的類的每個(gè)方法添加一個(gè)相應(yīng)的空的方法,匹配連接點(diǎn)的方法除外。然后,在激活階段,原方法體中的代碼將被交換到類載入時(shí)新產(chǎn)生的方法中,原方法將實(shí)現(xiàn)靜態(tài)織入時(shí)相同的處理,從而方面容器控制流程。前述代碼交換是由熱交換(HotSwap)實(shí)現(xiàn)的,這是JVM提供的API。通過(guò)方面容器與織入模型,AspectWerkz提供了動(dòng)態(tài)AOP的實(shí)現(xiàn)。


SpringFramework


SpringFramework是一個(gè)采用了反轉(zhuǎn)控制(Inversion of Control, IoC)策略的基于J2EE的輕量級(jí)應(yīng)用框架。SpringFramework的核心是IoC容器,對(duì)于其它應(yīng)用,如數(shù)據(jù)庫(kù)訪問(wèn),日志等,SpringFramework多使用現(xiàn)有的、成熟的框架。SpringFramework采用了模塊化的方式,各模塊可以共同使用,也可以單獨(dú)使用其中的一個(gè)模塊, SpringFramework的一個(gè)模塊提供了對(duì)動(dòng)態(tài)AOP的支持,SpringFramework中提供的聲明式事務(wù)管理就是基于動(dòng)態(tài)AOP的。


SpringFrameworkAOP的實(shí)現(xiàn)基于動(dòng)態(tài)代理(Dynamic Proxy), 動(dòng)態(tài)代理源于代理模式,即通過(guò)接口實(shí)現(xiàn)對(duì)業(yè)務(wù)對(duì)象的訪問(wèn),但動(dòng)態(tài)代理無(wú)需為每一個(gè)需代理的業(yè)務(wù)對(duì)象靜態(tài)的生成代理對(duì)象,只需提供需要代理的接口與代理實(shí)現(xiàn),就可以在運(yùn)行時(shí)動(dòng)態(tài)的生成代理對(duì)象,代理對(duì)上述接口的訪問(wèn),同樣的機(jī)制也使用于對(duì)類的代理,使用類似于修飾者的模式,通過(guò)子類化實(shí)現(xiàn)。SpringFramework默認(rèn)使用JDK提供的動(dòng)態(tài)代理機(jī)制,此時(shí),業(yè)務(wù)對(duì)象通過(guò)接口編程,若需要代理對(duì)類的訪問(wèn),則需要使用CGLIB,這是一個(gè)開(kāi)源的動(dòng)態(tài)代理實(shí)現(xiàn)。


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

JBoss


JBoss是一個(gè)開(kāi)源的符合J2EE規(guī)范的應(yīng)用服務(wù)器,作為J2EE規(guī)范的補(bǔ)充,Jboss中引入了AOP框架,為普通Java類提供了J2EE服務(wù),而無(wú)需遵循EJB規(guī)范。Jboss通過(guò)類載入時(shí),使用Javassist對(duì)字節(jié)碼操作實(shí)現(xiàn)動(dòng)態(tài)AOP框架,Javassist是一個(gè)開(kāi)源的編輯字節(jié)碼的類庫(kù)。


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


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

原文鏈接:http://blog.csdn.net/mimicimim/article/details/1770348
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            中文av一区特黄| 久久这里有精品15一区二区三区| 欧美激情视频网站| 欧美精品激情blacked18| 亚洲少妇一区| 久久狠狠婷婷| 亚洲免费精彩视频| 亚洲欧美一区二区三区在线| 一区在线电影| 一本久久a久久精品亚洲| 在线不卡亚洲| 亚洲尤物精选| 99亚洲视频| 久久男人av资源网站| 亚洲一区亚洲二区| 欧美成人有码| 免费久久99精品国产| 国产毛片精品国产一区二区三区| 亚洲第一区中文99精品| 国产一区二区三区精品久久久| 亚洲精品视频在线看| 亚洲国产一区二区三区在线播| 欧美一级淫片播放口| 亚洲女性喷水在线观看一区| 欧美了一区在线观看| 久久综合久色欧美综合狠狠 | 亚洲无线一线二线三线区别av| 亚洲一区中文字幕在线观看| 久久一综合视频| 噜噜噜在线观看免费视频日韩 | 久久久久亚洲综合| 国产伦精品免费视频| 日韩一级免费| 欧美成人精品影院| 亚洲欧美日韩国产中文| 亚洲国产cao| 红杏aⅴ成人免费视频| 国产精品色网| 欧美日韩视频在线一区二区 | 亚洲素人在线| 美女爽到呻吟久久久久| 欧美在线观看一区二区三区| 国产欧美在线视频| 免费人成精品欧美精品| 亚洲精品少妇30p| 久久国产精品久久w女人spa| 在线视频国内自拍亚洲视频| 欧美人与禽性xxxxx杂性| 午夜精品福利在线| 亚洲黄色免费| 亚洲欧美在线免费观看| 91久久国产自产拍夜夜嗨| 欧美性猛交视频| 欧美国产免费| 久久久久国产精品麻豆ai换脸| 亚洲人成亚洲人成在线观看| 久久久欧美一区二区| 先锋影音国产一区| 一区二区三区国产盗摄| 亚洲国产精品日韩| 国内精品视频在线观看| 国产精品嫩草影院av蜜臀| 牛人盗摄一区二区三区视频| 久久久久久9999| 在线一区视频| 999亚洲国产精| 亚洲区第一页| 一本久久综合亚洲鲁鲁五月天| 激情综合久久| 在线精品观看| 亚洲国产精品一区二区尤物区| 国产自产2019最新不卡| 国产酒店精品激情| 国语精品中文字幕| 在线日韩成人| 夜夜夜精品看看| 亚洲欧美在线高清| 久久久久久网站| 亚洲日本免费| 欧美亚洲三级| 欧美激情在线免费观看| 国产精品久久久久毛片软件 | 欧美影院成人| 女仆av观看一区| 国产精品久在线观看| 国产一区二区精品久久| 亚洲精品中文在线| 欧美中文字幕第一页| 91久久精品一区二区别| 亚洲综合色视频| 欧美日本韩国| 亚洲激情电影在线| 午夜精品三级视频福利| 亚洲激情一区| 久久精品1区| 国产美女精品免费电影| 一区二区三区日韩欧美精品| 麻豆精品精华液| 亚洲淫性视频| 国产精品久久久久久久久果冻传媒| 国内精品嫩模av私拍在线观看| 亚洲少妇自拍| 亚洲人成亚洲人成在线观看| 久久人人看视频| 欧美一区二区三区免费视频| 欧美激情国产日韩| 亚洲精品美女91| 亚洲人成77777在线观看网| 久久婷婷成人综合色| 亚洲第一偷拍| 亚洲精品美女久久7777777| 玖玖玖免费嫩草在线影院一区| 国产网站欧美日韩免费精品在线观看| 亚洲午夜精品一区二区三区他趣 | 午夜精品久久| 黄网站免费久久| 欧美激情小视频| 欧美日韩你懂的| 欧美亚洲一级片| 久久久亚洲影院你懂的| 亚洲精品久久在线| 亚洲一本大道在线| 亚洲大片在线观看| 在线视频精品一区| 国内精品久久国产| 亚洲日本成人网| 激情成人综合网| 99精品久久| 最近看过的日韩成人| 99精品视频免费| 一区二区三区在线免费观看| 亚洲毛片一区| 亚洲精选成人| 久久精品噜噜噜成人av农村| 亚洲视频第一页| 欧美国产成人精品| 欧美h视频在线| 国产情侣一区| 亚洲一区二区三区精品在线| 亚洲国产精品va在线看黑人| 羞羞答答国产精品www一本| 一区二区三区 在线观看视频| 麻豆久久婷婷| 久久综合久久美利坚合众国| 国产伦精品一区二区三| 一本综合精品| 午夜视频在线观看一区二区| 欧美视频导航| 亚洲一级二级| 国产精品激情电影| 亚洲小视频在线| 欧美一区在线直播| 国产欧美一区二区三区在线看蜜臀 | 久久久精品国产99久久精品芒果| 久久国产精彩视频| 欧美激情在线免费观看| 亚洲精品久久久久久下一站| 欧美成人免费在线观看| 亚洲毛片一区二区| 午夜精彩视频在线观看不卡 | 免费精品99久久国产综合精品| 国内久久婷婷综合| 可以免费看不卡的av网站| 亚洲国产成人午夜在线一区| 亚洲性人人天天夜夜摸| 国产综合色一区二区三区| 蜜臀a∨国产成人精品| 亚洲手机成人高清视频| 欧美成人免费全部| 在线一区欧美| 亚洲国产精品一区二区久 | 亚洲欧美影院| 亚洲夫妻自拍| 国内精品一区二区三区| 欧美午夜理伦三级在线观看| 久久久999成人| 欧美一区2区三区4区公司二百| 亚洲国产精品传媒在线观看 | 亚洲缚视频在线观看| 欧美视频精品一区| 欧美黄在线观看| 蜜桃久久av| 久久综合激情| 久久久激情视频| 欧美影院在线播放| 欧美一区二区在线播放| 午夜精品久久久99热福利| 亚洲一区二区三区免费观看| 夜夜嗨网站十八久久| 一区二区三区免费在线观看| 亚洲国产va精品久久久不卡综合| 免费在线亚洲| 欧美国产视频一区二区| 亚洲精品一区二| 亚洲区第一页| 亚洲香蕉视频| 久久青草欧美一区二区三区| 久久久噜久噜久久综合| 欧美福利在线观看| 亚洲婷婷综合色高清在线|