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

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

WhatisAspectJ

2019-11-18 15:17:20
字體:
來源:轉載
供稿:網友

  本文講解的主要內容,按照概念的重要程度,排列如下:
  
  aspectJ是一個代碼生成工具(Code Generator)。
  AspectJ語法就是用來定義代碼生成規則的語法。您假如使用過java Compiler Compiler (JavaCC),您會發現,兩者的代碼生成規則的理念驚人相似。
  AspectJ有自己的語法編譯工具,編譯的結果是Java Class文件,運行的時候,classpath需要包含AspectJ的一個jar文件(Runtime lib)。
  AspectJ和xDoclet的比較。AspectJ和EJB Descriptor的比較。
  本文的原則是,只細講其他資料沒有講到的東西,其他資料講過的東西,不講或略講。以節省網絡資源,更為了節省大家寶貴的時間。J
  
  2.Aspect Oriented PRogramming (AOP)
  本節簡單介紹AOP的概念,解釋我們為什么需要AOP。
  
  AOP是Object Oriented Programming(OOP)的補充。
  
  OOP能夠很好地解決對象的數據和封裝的問題,卻不能很好的解決Aspect("方面")分離的問題。下面舉例具體說明。
  
  比如,我們有一個Bank(銀行)類。Bank有兩個方法,deposit(存錢)和withdraw(取錢)。
  
  類和方法的定義如下:
  
  Code 2.1 Bank.java
  class Bank{
  public float deposit(AccountInfo account, float money){
   // 增加account賬戶的錢數,返回賬戶里當前的錢數
  }
  
  public float withdraw(AccountInfo account, float money){
   // 減少account賬戶的錢數,返回取出的錢數
  }
  };
  
  這兩個方法涉及到用戶的賬戶資金等重要信息,必須要非常小心,所以編寫完上面的商業邏輯之后,項目負責人又提出了新的要求--給Bank類的每個重要方法加上安全認證特性。
  
  于是,我們不得不分別在上面的兩個方法中加入安全認證的代碼。
  
  類和方法的定義如下:(新增加的代碼用不同的背景標出)
  
  Code 2.2 Bank.java
  class Bank{
  public float deposit(AccountInfo account, float money){
   // 驗證account是否為合法用戶
   // 增加account賬戶的錢數,返回賬戶里當前的錢數
  }
  
  public float withdraw(AccountInfo account, float money){
   // 驗證account是否為合法用戶
   // 減少account賬戶的錢數,返回取出的錢數
  }
  };
  
  這兩個方法都需要操作數據庫,為了保持數據完整性,項目負責人又提出了新的要求--給Bank類的每個操作數據庫的方法加上事務控制。
  
  于是,我們不得不分別在上面的兩個方法中加入安全認證的代碼。
  
  類和方法的定義如下:(新增加的代碼用不同的背景標出)
  
  Code 2.3 Bank.java
  class Bank{
  public float deposit(AccountInfo account, float money){
   // 驗證account是否為合法用戶
   // Begin Transaction
   // 增加account賬戶的錢數,返回賬戶里當前的錢數
   // End Transaction
  }
  
  public float withdraw(AccountInfo account, float money){
   // 驗證account是否為合法用戶
   // Begin Transaction
   // 減少account賬戶的錢數,返回取出的錢數
   // End Transaction
  }
  };
  
  我們看到,這些與商業邏輯無關的重復代碼遍布在整個程序中。實際的工程項目中涉及到的類和函數,遠遠不止兩個。如何解決這種問題?
  
  我們首先來看看OOP能否解決這個問題。
  
  我們利用Design Pattern的Template Pattern,可以抽出一個框架,改變上面的例子的整個設計結構。
  
  類和方法的定義如下:
  
  Code 2.4 Base.java
  abstract class Base{
  public float importantMethod(AccountInfo account, float money){
   // 驗證account是否為合法用戶
   // Begin Transaction
   
   float result = yourBusiness(account, money)
  
   // End Transaction
   return result;
  }
  
  protected abstract float yourBusiness(AccountInfo account, float money);
  };
  
  Code 2.5 BankDeposit.java
  class BankDeposit extends Base{
  protected float yourBusiness(AccountInfo account, float money){
   // 增加account賬戶的錢數,返回賬戶里當前的錢數
  }
  };
  
  Code 2.6 BankWithdraw.java
  class BankWithdraw extends Base{
  protected float yourBusiness(AccountInfo account, float money){
   // 減少account賬戶的錢數,返回取出的錢數
  }
  };
  
  這里我們用一種很勉強的方法實現了認證和事務代碼的重用。而且,有心的讀者可能會注重到,這種方法的前提是,強制所有的方法都遵守同樣的signature。
  
  假如有一個轉賬方法transfer(AccountInfo giver, AccountInfo receiver, float money),由于transfer方法的signature不同于yourBusiness的signature,這個方法無法使用上面的框架。
  
  這個例子中提到的認證,事務等方面,就是AOP所關心的Aspect。
  
  AOP就是為了解決這種問題而出現的。AOP的目的就是--Separation of Aspects (or Separation of Concerns).
  
  下面的章節,解釋EJB Descriptor,AspectJ,xDoclet等工具如何解決Separation of Aspects的問題。
  
  3.EJB Descriptor
  假如我們使用EJB實現上面的例子,Bank類可以作為一個Stateless session Bean實現。
  
  在Bank的代碼中只用考慮商業邏輯,不用考慮認證和事務等方面。
  
  認證和事務等方面在EJB Descriptor中定義,由EJB Container提供這些方面的實現。
  
  我們來看一下,如何使用EJB Descriptor描述上面的例子。
  
  EJB Descriptor包括一個ejb-jar.xml文件。ejb-jar.xml文件包含兩大部分,enterprise-beans和assembly-descriptor部分。enterprise-beans部分包含EJB的定義--JNDI Name,EJB Home, Interface, Bean Class Path等;assembly-descriptor部分包括配置信息的定義--安全角色,事務控制等等。
  
  下面給出上面例子對應的模擬EJB Descriptor。
  
  <ejb-jar>
  <enterprise-beans>
   <session>
     <ejb-name>Bank</ejb-name>
     …
     <ejb-class>example.Bank</ejb-class>
     <session-type>Stateless</session-type>
     <transaction-type>Container</transaction-type>
  <security-role-ref>
  <role-name>bank-account</role-name>
  </security-role-ref>
   </session>
  </enterprise-beans>
  
  <assembly-descriptor>
   <security-role>
    <role-name>bank-account</role-name>
   </security-role>
  
  <method-permission>
  <role-name>employee</role-name>
  <method>
  <ejb-name>Bank</ejb-name>
  <method-name>deposit</method-name>
  </method>
  <method>
  <ejb-name>Bank</ejb-name>
  <method-name>withdraw</method-name>
  </method>
  </method-permission>
  
  <container-transaction>
  <method>
  <ejb-name>Bank</ejb-name>
  <method-name>deposit</method-name>
  </method>
  <method>
  <ejb-name>Bank</ejb-name>
  <method-name>withdraw</method-name>
  </method>
  
  <trans-attribute>Required</trans-attribute>
  </container-transaction>
  </assembly-descriptor>
  </ejb-jar>
  
  本文后面會講到如何用AspectJ實現上例中的Separation of Aspects。
  
  讀者可以比較一下AspectJ語法和EJB Descriptor定義之間的對應關系。
  
  兩者都提供了類名、方法名的匹配規則,能夠把類的方法映射到認證,事務等Aspect(方面)。
  
  4.AspectJ
  這一節我們來看看AspectJ如何實現上例中的Separation of Aspects。
  
  使用AspectJ,我們不用對原有的代碼做任何修改,就可以為代碼提供不同的Aspect(方面)--比如,認證,事務等。
  
  我們只需要提供兩個不同的Aspect--認證Aspect和事務Aspect。
  
  
  Code 4.1 AuthAspect.java
  aspect AuthAspect{
   pointcut bankMethods() : execution (* Bank.deposit(…)) execution (* Bank. withdraw (…));
  
   Object around(): bankMethods(){
   // 驗證account是否為合法用戶
  
   return proceed();
   }
  };
  
  Code 4.2 TransactionAspect.java
  aspect TransactionAspect{
   pointcut bankMethods() : execution(* Bank.deposit(…)) execution (* Bank. withdraw (…));
  
   Object around(): bankMethods(){
   // Begin Transaction
   O

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性xxxxx极品娇小| 国产在线98福利播放视频| 91精品国产777在线观看| 国产美女主播一区| 久久亚洲国产精品成人av秋霞| 欧美洲成人男女午夜视频| 国产精品成av人在线视午夜片| 色噜噜狠狠狠综合曰曰曰| 精品国产一区二区三区久久久| 国产成人亚洲精品| 91国产一区在线| 成人黄色av免费在线观看| 欧美激情精品久久久久久蜜臀| 久久久久www| 精品国产欧美一区二区三区成人| 日产精品久久久一区二区福利| 亚洲第一区在线| 97国产精品久久| 日韩福利伦理影院免费| 亚洲精品视频免费在线观看| 精品少妇v888av| 在线播放日韩av| www.国产精品一二区| 亚洲福利在线播放| 成人欧美一区二区三区在线湿哒哒| 欧美片一区二区三区| 中文字幕日韩精品在线观看| 欧美激情视频一区二区| 国产精品稀缺呦系列在线| 国产色综合天天综合网| 国产精品揄拍500视频| 综合国产在线视频| 亚洲free性xxxx护士白浆| 午夜精品久久久99热福利| 国产精品电影久久久久电影网| 亚洲精品美女久久| 九九九热精品免费视频观看网站| 国产亚洲精品久久久久久牛牛| 精品毛片三在线观看| 91精品中国老女人| 欧美亚洲激情视频| 欧美日韩午夜剧场| 日韩电影在线观看永久视频免费网站| 欧美黄色小视频| 久久视频在线直播| 久久精品亚洲一区| 国产精品亚洲网站| 日本中文字幕久久看| 成人国产精品一区| 国产噜噜噜噜久久久久久久久| 岛国av一区二区三区| 亚洲一区二区黄| 国产精品久久久久久久久影视| 成人国产精品av| 成人xvideos免费视频| 国产99久久精品一区二区 夜夜躁日日躁| 久久99亚洲精品| 国产精品扒开腿做爽爽爽男男| 亚洲日本欧美中文幕| 久青草国产97香蕉在线视频| www.亚洲免费视频| 日韩av电影中文字幕| 欧美激情三级免费| 久久99青青精品免费观看| 国产欧美精品一区二区| 亚洲三级 欧美三级| 亚洲国产日韩欧美在线动漫| 国产精品免费在线免费| 一本久久综合亚洲鲁鲁| 国产精品国产三级国产aⅴ浪潮| 日韩美女主播视频| 午夜精品蜜臀一区二区三区免费| 国产婷婷色综合av蜜臀av| 国产精品美女免费| 亚洲免费av片| 日韩精品丝袜在线| 精品视频在线播放| 亚洲成色www8888| 欧美电影院免费观看| 8090理伦午夜在线电影| 欧美在线视频免费| 中文字幕国内精品| 色诱女教师一区二区三区| 欧美激情一区二区三级高清视频| 欧美精品在线观看91| 日本一区二三区好的精华液| 97色在线播放视频| 人体精品一二三区| 久久久成人精品| 国产精品美女免费视频| 亚洲高清色综合| 久久久91精品| 国产成人中文字幕| 国产一区二区视频在线观看| 欧美理论片在线观看| 欧美激情国产精品| 亚洲欧美在线第一页| 九九精品在线视频| 精品亚洲aⅴ在线观看| 国产精品女视频| 久久视频这里只有精品| 91麻豆国产精品| 精品magnet| 久久精品一本久久99精品| 中文字幕久久久| 欧洲成人在线观看| 亚洲精品视频在线播放| 亚洲成人精品av| 亚洲福利视频网站| 一个人www欧美| 成人美女av在线直播| 欧美成人免费全部观看天天性色| 久久国产一区二区三区| 色综久久综合桃花网| 国产一区二区三区中文| 亚洲精品综合久久中文字幕| 亚洲精品久久久一区二区三区| 色综合久久精品亚洲国产| 欧美猛少妇色xxxxx| 久99九色视频在线观看| 在线视频一区二区| 国产精品一区二区三区毛片淫片| 日韩性生活视频| 不卡av日日日| 国产美女扒开尿口久久久| 欧美激情视频一区| 992tv成人免费视频| 九九九热精品免费视频观看网站| 91免费综合在线| 国内精品一区二区三区| 久久亚洲国产成人| 日韩av一区在线| 久久视频这里只有精品| 亚洲一二在线观看| 日韩精品在线观看一区| 久久久国产一区二区| 日韩av在线天堂网| 亚洲国产一区二区三区在线观看| 亚洲性日韩精品一区二区| 国产视频精品va久久久久久| 精品色蜜蜜精品视频在线观看| 成人欧美在线观看| 欧美影院在线播放| 欧美一性一乱一交一视频| 午夜精品久久久久久久久久久久| 欧美日韩福利在线观看| 91色视频在线导航| 国产+人+亚洲| 国产精品免费电影| 中文字幕亚洲字幕| 久久久久久成人| 色综合伊人色综合网站| 国产精品丝袜一区二区三区| 91久久在线播放| 欧美午夜xxx| 精品毛片三在线观看| 91精品国产综合久久香蕉最新版| 九九精品视频在线观看| 国产精品成久久久久三级| 国产精品羞羞答答| 国产精品久久久久久久久借妻| 粗暴蹂躏中文一区二区三区| 色av中文字幕一区| 日日狠狠久久偷偷四色综合免费|