校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > aop的實現(xiàn)原理_動力節(jié)點Java學(xué)院整理

aop的實現(xiàn)原理_動力節(jié)點Java學(xué)院整理

熱門標簽:南召400電話辦理資費 揭陽外呼系統(tǒng)公司 地圖標注審核工作怎么樣注冊 鄭州中國移動400電話申請 福建ai電銷機器人加盟公司 去哪里辦卡 無錫電銷機器人銷售 招聘信息 地圖標注植物名稱 熱血傳奇沃瑪森林地圖標注

面向方面編程(Aspect Oriented Programming,簡稱AOP)是一種聲明式編程(Declarative Programming)。聲明式編程是和命令式編程(Imperative Programming)相對的概念。我們平時使用的編程語言,比如C++、Java、Ruby、Python等,都屬命令式編程。命令式編程的意思是,程序員需要一步步寫清楚程序需要如何做什么(How to do What)。聲明式編程的意思是,程序員不需要一步步告訴程序如何做,只需要告訴程序在哪些地方做什么(Where to do What)。比起命令式編程來,聲明式編程是在一個更高的層次上編程。聲明式編程語言是更高級的語言。聲明式編程通常處理一些總結(jié)性、總覽性的工作,不適合做順序相關(guān)的細節(jié)相關(guān)的底層工作。

如果說命令式編程是拼殺在第一線的基層工作人員,聲明式編程就是總設(shè)計師、規(guī)則制定者。聲明式編程語言的概念,和領(lǐng)域?qū)S谜Z言(Domain Specific Language,簡稱DSL)的概念有相通之處。DSL主要是指一些對應(yīng)專門領(lǐng)域的高層編程語言,和通用編程語言的概念相對。DSL對應(yīng)的專門領(lǐng)域(Domain)一般比較狹窄,或者對應(yīng)于某個行業(yè),或者對應(yīng)于某一類具體應(yīng)用程序,比如數(shù)據(jù)庫等。

最常見的DSL就是關(guān)系數(shù)據(jù)庫的結(jié)構(gòu)化數(shù)據(jù)查詢語言SQL。同時,SQL也是一門聲明式語言。SQL只需要告訴數(shù)據(jù)庫,處理符合一定條件的數(shù)據(jù),而不需要自己一步步判斷每一條數(shù)據(jù)是否符合條件。SQL的形式一般是 select … where …,update … where …,delete … where …。當(dāng)然,這樣一來,很多基層工作,SQL做不了。因此,大部分數(shù)據(jù)庫都提供了另外的命令式編程語言,用來編寫存儲過程等,以便處理一些更加細節(jié)的工作。
常見的DSL還有規(guī)則引擎(Rule Engine)語言、工作流(Workflow)語言等。規(guī)則引擎和工作流同時帶有命令式編程和聲明式

編程的特點。規(guī)則引擎允許用戶按照優(yōu)先級定義一系列條件組合,并定義對滿足條件的數(shù)據(jù)的處理過程。工作流也大致類似。工作流把最基本的條件判斷和循環(huán)語句的常見組合,定義為更加高級復(fù)雜的常用程序流程邏輯塊。用戶可以用這些高級流程塊組合更加復(fù)雜的流程塊,從而定義更加復(fù)雜的流程跳轉(zhuǎn)條件。用戶也可以定義當(dāng)程序運行上下文滿足一定條件的時候,應(yīng)該做什么樣的處理工作。規(guī)則引擎和工作流的語言形式有可能是XML格式,也有可能是Ruby、Python、JavaScript等腳本格式。我個人比較傾向于腳本格式,因為XML適合表達結(jié)構(gòu)化數(shù)據(jù),而不擅長表達邏輯流程。當(dāng)然,XML格式的好處也是顯而易見的。解析器可以很容易分析XML文件的結(jié)構(gòu),XML定義的條件或者程序流程都可以很方便地作為數(shù)據(jù)來處理。

介紹了聲明式編程和DSL之后,我們來看本章題目表達的內(nèi)容——AOP。AOP是聲明式編程,AOP語言也可以看作是DSL。AOP語言對應(yīng)的專門領(lǐng)域(Domain)就是程序結(jié)構(gòu)的方方面面(Aspect),比如程序的類、方法、成員變量等結(jié)構(gòu),以及針對這些程序結(jié)構(gòu)的通用工作處理,比如日志管理、權(quán)限管理、事務(wù)管理等。

AOP處理的工作內(nèi)容一般都是這樣的一些總結(jié)性工作:“我想讓所有的數(shù)據(jù)庫類都自動進行數(shù)據(jù)庫映射”、“我想打印出所有業(yè)務(wù)類的工作流程日志”、“我想給所有關(guān)鍵業(yè)務(wù)方法都加上事務(wù)管理功能”、“我想給所有敏感數(shù)據(jù)處理方法都加上安全管理授權(quán)機制”等等。 

下面我們介紹AOP的實現(xiàn)原理和使用方法。

AOP實現(xiàn)原理

AOP的實現(xiàn)原理可以看作是Proxy/Decorator設(shè)計模式的泛化。我們先來看Proxy模式的簡單例子。

Proxy { 
  innerObject; // 真正的對象 
  f1() { 
    // 做一些額外的事情 
 
    innerObject.f1(); // 調(diào)用真正的對象的對應(yīng)方法 
 
     // 做一些額外的事情 
  } 
} 

在Python、Ruby等動態(tài)類型語言中,只要實現(xiàn)了f1()方法的類,都可以被Proxy包裝。在Java等靜態(tài)類型語言中,則要求Proxy和被包裝對象實現(xiàn)相同的接口。動態(tài)語言實現(xiàn)Proxy模式要比靜態(tài)語言容易得多,動態(tài)語言實現(xiàn)AOP也要比靜態(tài)語言容易得多。假設(shè)我們用Proxy包裝了10個類,我們通過調(diào)用Proxy的f1()方法來調(diào)用這10個類的f1()方法,這樣,所有的f1()調(diào)用都會執(zhí)行同樣的一段“額外的工作”,從而實現(xiàn)了“所有被Proxy包裝的類,都執(zhí)行一段同樣的額外工作”的任務(wù)。這段“額外的工作”可能是進行日志記錄,權(quán)限檢查,事務(wù)管理等常見工作。

Proxy模式是可以疊加的。我們可以定義多種完成特定方面任務(wù)(Aspect),比如,我們可以定義LogProxy、SecurityProxy、TransactionProxy,分別進行日志管理、權(quán)限管理、事務(wù)管理。

LogProxy { 
   f1(){ 
      // 記錄方法進入信息 
 
      innerObject.f1();// 調(diào)用真正的對象的對應(yīng)方法 
 
     // 記錄方法退出信息 
  } 
} 
 
SecurityProxy { 
   f1(){ 
     // 進行權(quán)限驗證 
 
     innerObject.f1();// 調(diào)用真正的對象的對應(yīng)方法 
   } 
} 
 
TransactonProxy { 
   f1(){ 
     Open Transaction 
 
     innerObject.f1();// 調(diào)用真正的對象的對應(yīng)方法 
 
     Close Transaction 
   } 
} 

根據(jù)AOP的慣用叫法,上述的這些Proxy也叫做Advice。這些Proxy(or Advice)可以按照一定的內(nèi)外順序套起來,最外面的Proxy會最先執(zhí)行。包裝f1()方法,也叫做截獲(Intercept)f1()方法。Proxy/Advice有時候也叫做Interceptor。

看到這里,讀者可能會產(chǎn)生兩個問題。

問題一:上述代碼采用的Proxy模式只是面向?qū)ο蟮奶匦裕趺磿渡弦粋€新概念“面向方面(AOP)”呢?

問題二:Proxy模式雖然避免了重復(fù)“額外工作”代碼的問題,但是,每個相關(guān)類都要被Proxy包裝,這個工作也是很煩人。AOP Proxy如何能在應(yīng)用程序中大規(guī)模使用呢?

下面我們來解答著兩個問題。

對于問題一,我們來看一個復(fù)雜一點的例子。假設(shè)被包裝對象有f1()和f2()兩個方法都要被包裝。

RealObject{ 
   f1() {…} 
   f2() {…} 
} 

這個時候,我們應(yīng)該如何做?難道讓Proxy也定義f1()和f2()兩個方法?就象下面代碼這樣?

Proxy { 
  innerObject; // 真正的對象 
  f1() { 
    // 做一些額外的事情 
 
    innerObject.f1(); // 調(diào)用真正的對象的對應(yīng)方法 
 
    // 做一些額外的事情 
  } 
 
  f2() { 
    // 做一些額外的事情 
     
    innerObject.f2(); // 調(diào)用真正的對象的對應(yīng)方法 
     
    // 做一些額外的事情 
  } 
 
} 

這樣做有幾個不利之處。一是會造成代碼重復(fù),Proxy的f1()和f2()里面的“做一些額外的事情”代碼重復(fù)。二是難以擴展,被包裝對象可能有多個不同的方法,不同的被包裝對象需要被包裝的方法也可能不同。現(xiàn)在的問題就變成,“Proxy如何才能包裝截獲任何類的任何方法?” 

答案呼之欲出。對,就是Reflection。Java、Python、Ruby都支持Reflection,都支持Method(方法)對象。那么我們就利用Method Reflection編寫一個能夠解惑任何類的任何方法的Proxy/Advice/Interceptor。

MethodInterceptor{ 
 
  around( method ){ 
    // 做些額外的工作 
     
    method.invoke(…); // 調(diào)用真正的對象方法 
     
    // 做些額外的工作 
  } 
} 

上述的MethodInterceptor就可以分別包裝和截獲f1()和f2()兩個方法。

這里的method參數(shù)就是方法對象,在Java、Ruby等面向?qū)ο笳Z言中,需要用Reflection獲取方法對象。這個方法對象就相當(dāng)于函數(shù)式編程的函數(shù)對象。在函數(shù)式編程中,函數(shù)對象屬于“一等公民”,函數(shù)對象的獲取不需要經(jīng)過Reflection機制。所以,函數(shù)式編程對AOP的支持,比面向?qū)ο缶幊谈谩S纱宋覀兛吹剑珹OP對應(yīng)的問題領(lǐng)域確實超出了OOP的力所能及的范圍。OOP只能處理同一個類體系內(nèi)的同一個方法簽名的截獲和包裝工作,一旦涉及到一個類的多個不同方法,或者多個不同類體系的不同方法,OOP就黔驢技窮,無能為力了。

使用Method Reflection的方式截獲任何方法對象,是AOP的常用實現(xiàn)手段之一。另一個常見手段就是自動代碼生成了。這也回答了前面提出的問題二——如何在應(yīng)用系統(tǒng)中大規(guī)模使用AOP。

Proxy Pattern + Method Reflection + 自動代碼生成這樣一個三元組合,就是AOP的基本實現(xiàn)原理。Proxy Pattern 和 Method Reflection,前面已經(jīng)做了闡述,下面我們來講解自動代碼生成。

首先,AOP需要定義一種Aspect描述的DSL。Aspect DSL主要用來描述這樣的內(nèi)容:“用TransactionProxy包裝截獲business目錄下的所有類的公共業(yè)務(wù)方法”、“ 用SecurityProxy包裝截獲所有Login/Logout開頭的類的所有公共方法”、“用LogProxy包裝截獲所有文件的所有方法”等等。Aspect DSL的形式有多種多樣。有的是一種類似Java的語法,比如AspectJ;有的是XML格式或者各種腳本語言,比如,Spring AOP等。

有了Aspect DSL,AOP處理程序就可以生成代碼了。AOP生成代碼有三種可能方式:

(1)靜態(tài)編譯時期,源代碼生成。為每個符合條件的類方法產(chǎn)生對應(yīng)的Proxy對象。AspectJ以前就是這種方式。

(2)靜態(tài)編譯時期,處理編譯后的字節(jié)碼。Java、Python之類的虛擬機語言都有一種中間代碼(Java的中間代碼叫做字節(jié)碼),AOP處理程序可以分析字節(jié)碼,并直接產(chǎn)生字節(jié)碼形式的Proxy。這種方式也叫做靜態(tài)字節(jié)碼增強。AspectJ也支持這種方式。Java有一些開源項目,比如 ASM、Cglib等,可以分析并生成Java字節(jié)碼。這些開源項目不僅可以靜態(tài)分析增強字節(jié)碼,還可以在程序運行期動態(tài)分析增強字節(jié)碼。很多AOP項目,比如Spring AOP,都采用ASM/Cglib處理字節(jié)碼。

(3)動態(tài)運行時期,即時處理裝載到虛擬機內(nèi)部的類結(jié)構(gòu)字節(jié)碼。這也叫做動態(tài)增強。比如,Spring AOP。如前所述,Spring AOP使用ASM/Cglib之類的處理字節(jié)碼的開源項目。Java運行庫本身也提供了類似于ASM/Cglib的簡單的動態(tài)處理字節(jié)碼的API,叫做 Dynamic Proxy。

以上就是AOP的實現(xiàn)原理:Proxy Pattern + Method Reflection + Aspect DSL + 自動代碼生成。

總體來說,實現(xiàn)AOP的便利程度,函數(shù)式編程語言 > 動態(tài)類型語言 > 靜態(tài)類型語言。當(dāng)然,這個不等式并不是絕對的。有些動態(tài)類型語言提供了豐富強大的語法特性,實現(xiàn)AOP的便利程度,可能要超過函數(shù)式編程語言。

您可能感興趣的文章:
  • Java核心庫實現(xiàn)AOP過程
  • Java JDK動態(tài)代理(AOP)的實現(xiàn)原理與使用詳析
  • java Spring AOP詳解及簡單實例
  • 圖解JAVA中Spring Aop作用
  • 詳解Java反射實現(xiàn)Aop代理
  • java基于spring注解AOP的異常處理的方法
  • java AOP原理以及實例用法總結(jié)

標簽:黔南 南昌 鹽城 宣城 桂林 景德鎮(zhèn) 文山 東莞

巨人網(wǎng)絡(luò)通訊聲明:本文標題《aop的實現(xiàn)原理_動力節(jié)點Java學(xué)院整理》,本文關(guān)鍵詞  aop,的,實現(xiàn),原理,動力,節(jié)點,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《aop的實現(xiàn)原理_動力節(jié)點Java學(xué)院整理》相關(guān)的同類信息!
  • 本頁收集關(guān)于aop的實現(xiàn)原理_動力節(jié)點Java學(xué)院整理的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    国产精品69久久久久水密桃| 亚洲欧美日本韩国| 国产亚洲婷婷免费| 豆国产96在线|亚洲| 国产精品传媒入口麻豆| 91网站在线观看视频| 亚洲国产精品一区二区www在线| 91蜜桃网址入口| 日本中文一区二区三区| 日韩精品一区二区在线| 国产99久久久精品| 一个色妞综合视频在线观看| 欧美一区二区三区白人| 盗摄精品av一区二区三区| 洋洋成人永久网站入口| 欧美一级xxx| www.成人网.com| 奇米一区二区三区av| 最新中文字幕一区二区三区| 69p69国产精品| 成a人片国产精品| 日韩高清欧美激情| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 午夜精品福利视频网站| 久久综合999| 6080yy午夜一二三区久久| 成+人+亚洲+综合天堂| 久久99久久99精品免视看婷婷| 亚洲精品国产一区二区三区四区在线| 欧美成人综合网站| 欧美日韩三级一区二区| 91网站黄www| 大陆成人av片| 国产一二精品视频| 石原莉奈在线亚洲三区| 亚洲欧美日韩一区| 中文字幕一区二区三区在线不卡| 亚洲精品一区二区三区福利| 欧美人妇做爰xxxⅹ性高电影| av动漫一区二区| 国产成人av在线影院| 美国毛片一区二区| 免费看日韩精品| 日本欧洲一区二区| 日韩高清在线不卡| 蜜臀av在线播放一区二区三区| 亚洲一区视频在线| 亚洲一区二区三区四区在线| 日韩美女精品在线| 国产精品热久久久久夜色精品三区| 欧美精品一区二区三区很污很色的| 欧美一区二区二区| 日韩美女一区二区三区四区| 91.xcao| 日韩免费观看高清完整版| 精品久久久久香蕉网| 久久一二三国产| 中文一区在线播放| 欧美激情综合在线| 1000部国产精品成人观看| 亚洲柠檬福利资源导航| 亚洲精品你懂的| 婷婷综合另类小说色区| 毛片av一区二区| 国产真实乱子伦精品视频| 国产精品一线二线三线精华| 成人午夜激情影院| 在线观看一区二区精品视频| 欧美人成免费网站| 久久久久久亚洲综合影院红桃| 欧美精彩视频一区二区三区| 日本一区二区三区电影| 一区二区三区在线免费播放| 日韩av二区在线播放| 国产乱妇无码大片在线观看| 成人app在线| 在线电影一区二区三区| 国产丝袜在线精品| 亚洲男同性恋视频| 蜜臀久久99精品久久久久宅男| 国产一区美女在线| 日本乱人伦aⅴ精品| 欧美mv日韩mv亚洲| 亚洲美女电影在线| 极品少妇xxxx偷拍精品少妇| 成人美女视频在线观看18| 欧美久久久一区| 自拍偷自拍亚洲精品播放| 蜜臀va亚洲va欧美va天堂| 成人国产精品免费观看动漫| 欧美一区国产二区| 亚洲男同性视频| 国产精品1024| 日韩区在线观看| 国产在线麻豆精品观看| 91国偷自产一区二区三区成为亚洲经典 | 色悠久久久久综合欧美99| 欧美日韩高清一区二区三区| 国产精品久久夜| 美国一区二区三区在线播放| 成人av网站在线观看免费| 日韩一区二区免费在线电影| 国产精品欧美综合在线| 麻豆91在线播放| 欧美视频一区二区三区四区| 中文字幕av一区 二区| 激情综合亚洲精品| 91精品国产综合久久久久久漫画 | 99久精品国产| 久久久不卡网国产精品二区| 亚洲午夜久久久久久久久电影院 | 成人a免费在线看| 久久免费美女视频| 日韩精品免费视频人成| 91高清在线观看| 一色桃子久久精品亚洲| 国产suv精品一区二区883| 精品粉嫩aⅴ一区二区三区四区| 亚洲综合久久久| 91在线视频观看| 日韩一区欧美一区| 成人a免费在线看| 国产日本一区二区| 精品一区二区在线观看| 日韩女优制服丝袜电影| 久久精品国产亚洲一区二区三区| 欧美高清激情brazzers| 日韩影院精彩在线| 欧美成人免费网站| 黄色资源网久久资源365| 日韩一区二区三区精品视频| 日本不卡免费在线视频| 日韩午夜小视频| 黄页视频在线91| 亚洲欧洲在线观看av| 91在线视频官网| 亚洲国产日韩a在线播放性色| 精品视频在线看| 日韩av在线免费观看不卡| 日韩欧美一级二级三级久久久| 免费的国产精品| 久久免费偷拍视频| 91丨九色丨尤物| 亚洲一区二区在线免费观看视频| 欧美日韩美女一区二区| 久久精品国产一区二区三区免费看 | 蜜臀91精品一区二区三区| 久久女同精品一区二区| 成人综合激情网| 依依成人综合视频| 日韩欧美一区二区视频| 国产激情精品久久久第一区二区| 中文成人综合网| 欧美视频在线播放| 国产精品77777竹菊影视小说| 国产精品区一区二区三区| jizz一区二区| 日韩激情中文字幕| 一区二区欧美国产| 色欧美片视频在线观看在线视频| 色视频一区二区| 精品国产乱码久久久久久牛牛| 精品国产一区二区三区四区四| 欧美va亚洲va在线观看蝴蝶网| 久久精品人人做人人爽人人| 亚洲一区二区三区四区中文字幕| 免费精品99久久国产综合精品| 国产经典欧美精品| 亚洲欧洲韩国日本视频| 精品一区二区三区不卡| 欧美午夜电影一区| 免费不卡在线视频| 1024成人网色www| 日韩欧美二区三区| 91国内精品野花午夜精品 | 强制捆绑调教一区二区| 亚洲国产高清在线| 日韩视频永久免费| 色诱视频网站一区| 丁香一区二区三区| 精品在线观看视频| 亚洲尤物视频在线| 国产精品的网站| 久久久av毛片精品| 日韩一区二区三区电影| 欧美在线999| 99精品国产热久久91蜜凸| 国产伦精品一区二区三区免费 | 国产麻豆精品theporn| 午夜激情一区二区| 一区二区三区四区不卡在线| 久久综合国产精品| 精品欧美一区二区久久| 欧美日韩成人综合天天影院| 在线欧美日韩精品| 日本乱人伦一区| 在线观看视频欧美| 色婷婷综合五月| 91农村精品一区二区在线| 国产很黄免费观看久久|