麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

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

2019-11-18 13:04:52
字體:
供稿:網(wǎng)友

  概述
  面向方面編程(aspect-Oriented PRogramming, AOP)是一個令人興奮的新模式。就開發(fā)軟件系統(tǒng)而言,它的影響力將會和有15到20年的面向?qū)ο笠粯印C嫦蚍矫婢幊毯兔嫦驅(qū)ο缶幊滩坏皇腔ハ喔偁幍募夹g(shù)而且是可以很好的互補。面向?qū)ο缶幊讨饕糜跒橥粚ο髮哟蔚墓眯袨榻!K娜觞c是將公共行為應(yīng)用于多個無關(guān)對象模型之間。而這恰恰是AOP適合的地方。AOP答應(yīng)定義交叉的關(guān)系,那些關(guān)系應(yīng)用于跨國分開的,非常不同的對象模型。AOP答應(yīng)你層次化功能性而不是嵌入功能性,那使得代碼有更好的可度性和易于維護性。我喜歡認為OOP是自上而下的軟件開發(fā),而AOP是自左而右的軟件開發(fā),它們是完全直交的技術(shù),并且互相很好的補充。
  在OOP的工具里是繼續(xù),封裝和多態(tài),而AOP的組件是通知/攔截器,導言,元數(shù)據(jù)和pintcuts.讓我們看一下這些定義。
  
  通知/攔截器
  一個通知是一個邏輯,這個邏輯有特定的事件觸發(fā)。它是行為,這個行為能夠被插入在調(diào)用者和被調(diào)用者之間,在一個方法調(diào)用者和實際的方法之間。通知是AOP真正的要害。通知答應(yīng)你去透明的應(yīng)用一些事物,像日志和記錄到一個存在的對象模型。
  在 JBoss AOP中,我們用攔截器是實現(xiàn)了通知。你能夠定義攔截器,它攔截方法調(diào)用,構(gòu)造器調(diào)用和域訪問。后面,我們將闡明怎樣應(yīng)用這些攔截器到一個存在的對象模型。
  
  導言
  導言是一個增加方法或者域到一個存在的類中的途徑。它們甚至答應(yīng)你改變當前存在的類是顯的接口,并且引入一個混合的類,這個類是實現(xiàn)了新的接口。導言答應(yīng)你帶入多繼續(xù)到一般的java類。導言一個主要的用例是當你有一個方面,你想讓這個方面有一個運行時間借口時。你想應(yīng)用你的方面跨越不同的對象層次,但是你仍然要應(yīng)用開發(fā)者去能夠調(diào)用特定方面的APIs.
  Apple apple    = new Apple();
  LoggingAPI logging = (LoggingAPI)apple;
  Apple.setLoggingLevel(VERBOSE);
  導言能夠是一個方法,它將一個新的API綁定到一個存在的對象模型。
  
  元數(shù)據(jù)
  元數(shù)據(jù)是能夠綁定到一個類的附加信息,在靜態(tài)或者運行時間。元數(shù)據(jù)更加有力力量的是,你能夠動態(tài)綁定元數(shù)據(jù)到一個給定的對象實例。元數(shù)據(jù)非常強大的,當你真正編寫應(yīng)用于任何對象的一般方面,而邏輯需要知道制定類的信息時。在使用的一個好的元數(shù)據(jù)類比就是EJB規(guī)范。在EJB的xml發(fā)布描述符中,你需要定義基于每一個方法的事務(wù)屬性。應(yīng)用服務(wù)器指導什么時候,什么地方開始,掛起或者提交一個事務(wù),因為你在BEAN的XML的配置文件中的元數(shù)據(jù)內(nèi)已經(jīng)定義如方法:Required,RequiresNew,Support等等,它們綁定在你的EJB類和事務(wù)治理之間。
  C#把元數(shù)據(jù)成為了這個語言的組成部分。XDoclet是另一個動作的元數(shù)據(jù)的例子。假如你曾經(jīng)用過XDoclet生成過EJB文件和發(fā)布描述符,你就會知道元數(shù)據(jù)的力量。在JDK1.5中,當元數(shù)據(jù)被加入java語言中,JCP一致同意。(見JSR175)。盡管直到JSR175成為了事實,一個好的AOP框架也應(yīng)該提供一種機制去定義在運行時間有效的類級元數(shù)據(jù)。
  
  Pointcuts
  假如攔截器,導言和元數(shù)據(jù)是AOP的特征,那么pointcuts就是粘合劑。Pointcuts告訴AOP框架,那些攔截器綁定到那些類, 什么原數(shù)據(jù)將應(yīng)用于那些類或者那一個導言將被傳入那些類。Pointcuts定義各種AOP特征將怎樣應(yīng)用于你應(yīng)用中的類。
  
  在動作中的AOP
  例1.使用攔截器
  JBoss 4.0帶了一個AOP框架。這個框架和JBoss應(yīng)用服務(wù)器緊密地結(jié)合,但是你也能夠在你的應(yīng)用中,單獨的運行它。直到你看了動作中看到它,你才會完全的理解這個概念,所以讓我們用一個來自于JBoss AOP的例子,來說明這個模塊所有的部分是如何一起工作的。在這章余下的部分,我們將建立一個例子來跟蹤使用AOP的框架。
  
  定義一個攔截器
  為了實現(xiàn)我們對于框架的跟蹤,我們必須作的第一件事是定義一個攔截器,它將作實際的工作。在JBOSS AOP中,所有的攔截器必須實現(xiàn)org.jboss.aop.Interceptor 接口。
  public interface Interceptor
  {
    public String getName();
    public InvocationResponse invoke(Invocation invocation) throws Throwable;
  }
  
  在JBoss AOP中,被攔截的所有域,構(gòu)造器和方法被轉(zhuǎn)成一般的invoke調(diào)用。方法的參數(shù)被填入一個Invocation對象,并且方法的返回值,域的存取或者構(gòu)造器被填入一個InvocationResponse對象。這個Invocation對象也驅(qū)動這個攔截鏈。為了清楚地說明這個,讓我們看一下,在這個例子中,所有的對象是如何配合到一起的。
  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.
     // 繼續(xù)。調(diào)用真正的方法或者構(gòu)造器
     InvocationResponse rsp = invocation.invokeNext();
     System.out.println(Leaving + message);
     return rsp;
    }
  }
  
  上面的攔截器將攔截所有的對一個域,構(gòu)造器或方法的調(diào)用。假如調(diào)用的類型是一個方法或者構(gòu)造器,一個帶有方法或構(gòu)造器簽名的消息將輸出到控制平臺。
  
  綁定攔截器
  好了,這樣我們就定義了攔截器。但是怎么綁定這個攔截器到實際的類?為了做這個,我們需要定義一個pointcut。對于JBoss AOP, pointcuts 是在一個XML文件中定義的。讓我們看一下這看起來象什么。
  
  
  
   
     
      
     

   

  
  
  上面的pointcut綁定TracingInterceptor到一個叫做POJO的類。這看起來有一點麻煩;我們不得不為每一個想跟蹤的類創(chuàng)建一個pointcut嗎?幸運的是,interceptor-pointcut的類屬性可以用任何的正規(guī)表達式。所以假如你想跟蹤由JVM載入的類,類表達式將變?yōu)?.*。假如你僅僅想跟蹤一個特定的包,那么表達式將是com.acme.mypackge.*。
  當單獨運行JBoss AOP時,任何符合 META-INF/jboss-aop.xml模式的XML文件將被JBoss AOP 運行時間所載入。假如相關(guān)的路徑被包含在任何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()的調(diào)用。輸出看起來如下:
  Entering method: main
  Entering constructor: public POJO()
  Leaving constructor: public POJO()
  Entering method: helloWorld
  Hello World!
  Leaving method: helloWorld
  Leaving method: main
  
  你能夠在這里下載JBoss AOP和離子代碼。編譯和執(zhí)行:
  
  $ 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 對綁定的攔截器做字節(jié)碼操作。因為沒有編譯步驟,AOP運行時間必須有ClassLoader的總控。假如你正運行在非JBoss應(yīng)用服務(wù)器,你必須用JBoss制定的一個類載入器覆蓋系統(tǒng)的類載入器。
  TraceingInterceptor不跟蹤域訪問,因為它有一點繁瑣。對于開發(fā)者,實現(xiàn)get()和set()方法去封裝域訪問是一個一般的實踐。假如TracingInterceptor能夠過濾出,并且不跟蹤這些方法,那是非常好的。這個例子顯示你能夠用JBoss AOP 元數(shù)據(jù)去實現(xiàn)基于任一方法的過濾。一般,元數(shù)據(jù)用于更復雜的事情,如定義事務(wù)屬性,每個方法的安全角色或者持久性映射,但是這個例子應(yīng)該足夠說明元數(shù)據(jù)能夠怎樣用在 AOP使能的應(yīng)用中。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产精品一区二区手机在线观看 | 舌头伸进添的我好爽高潮网站 | 黄色一级电影网 | av成人免费在线观看 | china对白普通话xxxx | 成人h视频在线 | 免费观看在线 | 国产一级性生活视频 | 国产中文99视频在线观看 | 午夜精品在线视频 | 亚洲看片网 | 国产羞羞视频在线免费观看 | 99热1| 一区二区久久久久草草 | 九九视频精品在线观看 | 在线观看免费污视频 | 国产九色视频在线观看 | 羞羞视频免费观看网站 | 蜜桃精品视频 | 欧美精品 | 99这里有精品 | 亚洲成人国产 | fc2成人免费人成在线观看播放 | 99r国产精品 | 久久777国产线看观看精品 | 精品视频在线免费看 | 黄色网址电影 | 黄在线| 国人精品视频在线观看 | 越南一级黄色片 | 久草在线免费资源站 | 小雪奶水翁胀公吸小说最新章节 | 欧美a级在线免费观看 | a级黄色片视频 | aa国产视频一区二区 | 日本特级a一片免费观看 | 日韩精品免费一区二区三区 | 久久精品国产亚洲7777小说 | 爽毛片 | 一级毛片在线看 | 手机免费看一级片 |