亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

面向方面編程AOP和JBoss(一)

2019-11-18 13:04:52
字體:
來源:轉載
供稿:網友

  概述
  面向方面編程(aspect-Oriented PRogramming, AOP)是一個令人興奮的新模式。就開發軟件系統而言,它的影響力將會和有15到20年的面向對象一樣。面向方面編程和面向對象編程不但不是互相競爭的技術而且是可以很好的互補。面向對象編程主要用于為同一對象層次的公用行為建模。它的弱點是將公共行為應用于多個無關對象模型之間。而這恰恰是AOP適合的地方。AOP答應定義交叉的關系,那些關系應用于跨國分開的,非常不同的對象模型。AOP答應你層次化功能性而不是嵌入功能性,那使得代碼有更好的可度性和易于維護性。我喜歡認為OOP是自上而下的軟件開發,而AOP是自左而右的軟件開發,它們是完全直交的技術,并且互相很好的補充。
  在OOP的工具里是繼續,封裝和多態,而AOP的組件是通知/攔截器,導言,元數據和pintcuts.讓我們看一下這些定義。
  
  通知/攔截器
  一個通知是一個邏輯,這個邏輯有特定的事件觸發。它是行為,這個行為能夠被插入在調用者和被調用者之間,在一個方法調用者和實際的方法之間。通知是AOP真正的要害。通知答應你去透明的應用一些事物,像日志和記錄到一個存在的對象模型。
  在 JBoss AOP中,我們用攔截器是實現了通知。你能夠定義攔截器,它攔截方法調用,構造器調用和域訪問。后面,我們將闡明怎樣應用這些攔截器到一個存在的對象模型。
  
  導言
  導言是一個增加方法或者域到一個存在的類中的途徑。它們甚至答應你改變當前存在的類是顯的接口,并且引入一個混合的類,這個類是實現了新的接口。導言答應你帶入多繼續到一般的java類。導言一個主要的用例是當你有一個方面,你想讓這個方面有一個運行時間借口時。你想應用你的方面跨越不同的對象層次,但是你仍然要應用開發者去能夠調用特定方面的APIs.
  Apple apple    = new Apple();
  LoggingAPI logging = (LoggingAPI)apple;
  Apple.setLoggingLevel(VERBOSE);
  導言能夠是一個方法,它將一個新的API綁定到一個存在的對象模型。
  
  元數據
  元數據是能夠綁定到一個類的附加信息,在靜態或者運行時間。元數據更加有力力量的是,你能夠動態綁定元數據到一個給定的對象實例。元數據非常強大的,當你真正編寫應用于任何對象的一般方面,而邏輯需要知道制定類的信息時。在使用的一個好的元數據類比就是EJB規范。在EJB的xml發布描述符中,你需要定義基于每一個方法的事務屬性。應用服務器指導什么時候,什么地方開始,掛起或者提交一個事務,因為你在BEAN的XML的配置文件中的元數據內已經定義如方法:Required,RequiresNew,Support等等,它們綁定在你的EJB類和事務治理之間。
  C#把元數據成為了這個語言的組成部分。XDoclet是另一個動作的元數據的例子。假如你曾經用過XDoclet生成過EJB文件和發布描述符,你就會知道元數據的力量。在JDK1.5中,當元數據被加入java語言中,JCP一致同意。(見JSR175)。盡管直到JSR175成為了事實,一個好的AOP框架也應該提供一種機制去定義在運行時間有效的類級元數據。
  
  Pointcuts
  假如攔截器,導言和元數據是AOP的特征,那么pointcuts就是粘合劑。Pointcuts告訴AOP框架,那些攔截器綁定到那些類, 什么原數據將應用于那些類或者那一個導言將被傳入那些類。Pointcuts定義各種AOP特征將怎樣應用于你應用中的類。
  
  在動作中的AOP
  例1.使用攔截器
  JBoss 4.0帶了一個AOP框架。這個框架和JBoss應用服務器緊密地結合,但是你也能夠在你的應用中,單獨的運行它。直到你看了動作中看到它,你才會完全的理解這個概念,所以讓我們用一個來自于JBoss AOP的例子,來說明這個模塊所有的部分是如何一起工作的。在這章余下的部分,我們將建立一個例子來跟蹤使用AOP的框架。
  
  定義一個攔截器
  為了實現我們對于框架的跟蹤,我們必須作的第一件事是定義一個攔截器,它將作實際的工作。在JBOSS AOP中,所有的攔截器必須實現org.jboss.aop.Interceptor 接口。
  public interface Interceptor
  {
    public String getName();
    public InvocationResponse invoke(Invocation invocation) throws Throwable;
  }
  
  在JBoss AOP中,被攔截的所有域,構造器和方法被轉成一般的invoke調用。方法的參數被填入一個Invocation對象,并且方法的返回值,域的存取或者構造器被填入一個InvocationResponse對象。這個Invocation對象也驅動這個攔截鏈。為了清楚地說明這個,讓我們看一下,在這個例子中,所有的對象是如何配合到一起的。
  import org.jboss.aop.*;
  import java.lang.reflect.*;
  
  public class TracingInterceptor implements Interceptor
  {
    public String getName() { return TracingInterceptor; }
    public InvocationResponse invoke(Invocation invocation)
      throws Throwable
    {
     String message = null;
  
     if (invocation.getType() == InvocationType.METHOD)
     {
       Method method = MethodInvocation.getMethod(invocation);
       message    = method: + method.getName();
     }
     else if (invocation.getType() == InvocationType.CONSTRUCTOR)
     {
       Constructor c = ConstructorInvocation.getConstructor(invocation);
       message    = constructor: + c.toString();
     }
     else
     {
       // Do nothing for fields. Just too verbose.
       //對于域什么也不做。太繁瑣。
       return invocation.invokeNext();
     }
  
     System.out.println(Entering + message);
  
     // Continue on. Invoke the real method or constructor.
     // 繼續。調用真正的方法或者構造器
     InvocationResponse rsp = invocation.invokeNext();
     System.out.println(Leaving + message);
     return rsp;
    }
  }
  
  上面的攔截器將攔截所有的對一個域,構造器或方法的調用。假如調用的類型是一個方法或者構造器,一個帶有方法或構造器簽名的消息將輸出到控制平臺。
  
  綁定攔截器
  好了,這樣我們就定義了攔截器。但是怎么綁定這個攔截器到實際的類?為了做這個,我們需要定義一個pointcut。對于JBoss AOP, pointcuts 是在一個XML文件中定義的。讓我們看一下這看起來象什么。
  
  
  
   
     
      
     

   

  
  
  上面的pointcut綁定TracingInterceptor到一個叫做POJO的類。這看起來有一點麻煩;我們不得不為每一個想跟蹤的類創建一個pointcut嗎?幸運的是,interceptor-pointcut的類屬性可以用任何的正規表達式。所以假如你想跟蹤由JVM載入的類,類表達式將變為 .*。假如你僅僅想跟蹤一個特定的包,那么表達式將是com.acme.mypackge.*。
  當單獨運行JBoss AOP時,任何符合 META-INF/jboss-aop.xml模式的XML文件將被JBoss AOP 運行時間所載入。假如相關的路徑被包含在任何JAR或你的CLASSPATH的目錄中,那個特定的XML文件將在啟動時,由JBoss AOP 運行時間所載入。
  
  運行這個例子
  我們將用上面定義的pointcut去運行例子。POJO類看起來如下:
  
  [code]public class POJO
  {
    public POJO() {}
    public void helloWorld() { System.out.println(Hello World!); }
    public static void main(String[] args)
    {
     POJO pojo = new POJO();
     pojo.helloWorld();
    }
  }
  [/code]
  TracingInterceptor將攔截對main(),POJO()和helloWorld()的調用。輸出看起來如下:
  Entering method: main
  Entering constructor: public POJO()
  Leaving constructor: public POJO()
  Entering method: helloWorld
  Hello World!
  Leaving method: helloWorld
  Leaving method: main
  
  你能夠在這里下載JBoss AOP和離子代碼。編譯和執行:
  
  $ cd oreilly-aop/example1
  $ eXPort CLASSPATH=.;jboss-common.jar;jboss-aop.jar;javassist.jar
  $ javac *.java
  $ java -Djava.system.class.loader=org.jboss.aop.standalone.SystemClassLoader POJO
  
  JBoss AOP 對綁定的攔截器做字節碼操作。因為沒有編譯步驟,AOP運行時間必須有ClassLoader的總控。假如你正運行在非JBoss應用服務器,你必須用JBoss制定的一個類載入器覆蓋系統的類載入器。
  TraceingInterceptor不跟蹤域訪問,因為它有一點繁瑣。對于開發者,實現get()和set()方法去封裝域訪問是一個一般的實踐。假如TracingInterceptor能夠過濾出,并且不跟蹤這些方法,那是非常好的。這個例子顯示你能夠用JBoss AOP 元數據去實現基于任一方法的過濾。一般,元數據用于更復雜的事情,如定義事務屬性,每個方法的安全角色或者持久性映射,但是這個例子應該足夠說明元數據能夠怎樣用在 AOP使能的應用中。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩成人av一区| 亚洲精品美女久久| 日韩av快播网址| 欧美一级大片视频| 91理论片午午论夜理片久久| 久久久久久久香蕉网| 欧美日韩国产一区中文午夜| 久久亚洲精品毛片| 欧美大胆a视频| 久久国产视频网站| 66m—66摸成人免费视频| 国产精品第三页| 日韩中文字幕网| 粗暴蹂躏中文一区二区三区| 7777精品久久久久久| 国产自摸综合网| 精品高清美女精品国产区| 国产欧美日韩免费| 91天堂在线观看| 在线精品高清中文字幕| 国产精品27p| 在线播放国产一区中文字幕剧情欧美| 成人免费网站在线看| 亚洲美女久久久| 国产精品久久久久久久久久久久久| 欧美国产视频一区二区| 国产亚洲精品久久久优势| 精品久久久中文| 亚洲欧美日韩天堂一区二区| 欧美日韩亚洲一区二| 成人深夜直播免费观看| 亚洲人成网站在线播| 成人精品视频在线| 亚洲欧美成人一区二区在线电影| 一道本无吗dⅴd在线播放一区| 国产做受69高潮| 中文字幕9999| 中国china体内裑精亚洲片| 欧美性受xxxx黑人猛交| 亚洲人成电影网站色…| 亚洲一品av免费观看| 久久久久久久久久久91| 欧美激情一区二区三区成人| 日韩精品视频中文在线观看| 理论片在线不卡免费观看| 欧美日韩美女视频| 91热精品视频| 国产精品久久久久久婷婷天堂| 5566日本婷婷色中文字幕97| 在线观看国产精品淫| 日韩中文字幕在线播放| 热久久这里只有精品| 日韩欧美视频一区二区三区| 欧美性感美女h网站在线观看免费| 国产精品免费视频xxxx| 91手机视频在线观看| 国产精品高潮视频| www国产亚洲精品久久网站| 日韩av中文字幕在线免费观看| 欧美亚洲成人网| 亚洲日韩中文字幕| 欧美精品国产精品日韩精品| www高清在线视频日韩欧美| 久久久久久久亚洲精品| 日韩中文视频免费在线观看| 色悠久久久久综合先锋影音下载| 亚洲精品久久久久久久久久久久久| 26uuu另类亚洲欧美日本一| 欧美激情第6页| 欧美精品生活片| 91精品久久久久久久久久久| 国产精品女主播| 日韩av一区二区在线| 久久久久久九九九| 91精品国产色综合久久不卡98| 亚洲精品suv精品一区二区| 亚洲丁香婷深爱综合| 夜夜嗨av一区二区三区四区| 亚洲美女性视频| 欧美大片免费观看在线观看网站推荐| 亚洲理论电影网| 插插插亚洲综合网| 狠狠色狠狠色综合日日五| 久久久黄色av| 国产成人精品一区二区| 亚洲a在线观看| 日韩在线观看精品| 亚洲在线视频观看| 日韩欧中文字幕| 国产精品视频精品视频| 91精品中文在线| 国产精品露脸自拍| 国产成人欧美在线观看| 欧美高清在线视频观看不卡| 国产精品成人一区二区三区吃奶| 久久久久亚洲精品国产| 久久久久久免费精品| 亚洲国产精品资源| 人九九综合九九宗合| 国产综合在线看| 亚洲国产婷婷香蕉久久久久久| 亚洲国产成人av在线| 55夜色66夜色国产精品视频| 国产精品jvid在线观看蜜臀| 国产精品视频午夜| 日韩在线免费观看视频| 亚洲人成欧美中文字幕| 国产精品香蕉在线观看| 亚洲一区二区久久| 国产成人黄色av| 欧美激情乱人伦一区| 欧美激情a在线| 欧美日韩亚洲一区二| 成人疯狂猛交xxx| 日韩欧美福利视频| 日韩中文字幕不卡视频| 中文字幕欧美在线| 国产精品激情av电影在线观看| 欧美大成色www永久网站婷| 亚洲午夜精品久久久久久性色| 91理论片午午论夜理片久久| 亚洲最大成人在线| 亚洲a成v人在线观看| 欧美体内谢she精2性欧美| 亚洲成人aaa| 国产91精品黑色丝袜高跟鞋| 国产日韩av在线| 欧美国产日韩在线| 在线免费看av不卡| 欧美成人免费网| 在线观看国产精品91| 伊人一区二区三区久久精品| 欧美亚洲午夜视频在线观看| 亚洲人成电影在线观看天堂色| 亚洲人永久免费| 欧美日韩国产精品一区| 欧美日韩午夜视频在线观看| 欧美激情xxxx| 国内久久久精品| 亚洲aⅴ日韩av电影在线观看| 国产精品久久久久久久久久| 国产精品v片在线观看不卡| 中文字幕国产亚洲| 91高潮精品免费porn| 亚洲一区二区免费| 国产+成+人+亚洲欧洲| 播播国产欧美激情| 欧美激情精品久久久| 久久精品99无色码中文字幕| 国产精品第8页| 欧洲一区二区视频| 精品久久久久久中文字幕大豆网| 久久精品国产91精品亚洲| 91色p视频在线| 国产精品稀缺呦系列在线| 国产精品成人国产乱一区| 91人成网站www| 色琪琪综合男人的天堂aⅴ视频| 日韩成人在线视频| 久久青草福利网站| 麻豆国产精品va在线观看不卡| 韩国福利视频一区| 欧美日韩国产成人高清视频| 伊人久久精品视频|