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

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

What is AspectJ

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

  本文講解的主要內容,按照概念的重要程度,排列如下:
  
  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
国产欧美日韩综合精品| 亚洲第一黄色网| 亚洲欧美激情四射在线日| 亚洲人成伊人成综合网久久久| 国产在线999| 亚洲精品视频在线观看视频| 91精品久久久久久久久不口人| 66m—66摸成人免费视频| 欧美成人精品不卡视频在线观看| 日本免费一区二区三区视频观看| 亚洲精品wwwww| 亚洲男人天堂视频| 色综合天天综合网国产成人网| 国产精品久久在线观看| 国产精品激情自拍| 一区二区三区在线播放欧美| 国产国产精品人在线视| 91日本在线视频| 久久久国产精品x99av| 国产精品xxxxx| 国产不卡精品视男人的天堂| 国产丝袜精品第一页| 日韩综合中文字幕| 欧美国产精品va在线观看| 69av在线播放| 精品久久久久久电影| 最近2019中文免费高清视频观看www99| 久久久天堂国产精品女人| 色99之美女主播在线视频| 欧美乱大交xxxxx| 久久免费视频网站| 亚洲一区二区三区四区视频| 欧美高跟鞋交xxxxhd| 91午夜理伦私人影院| 日韩福利伦理影院免费| 亚洲美女又黄又爽在线观看| 91精品国产91久久久久福利| 精品久久久久久中文字幕一区奶水| 久操成人在线视频| 欧美亚洲视频一区二区| 日韩成人高清在线| 欧美—级a级欧美特级ar全黄| 欧日韩不卡在线视频| 精品久久香蕉国产线看观看gif| 亚洲视频在线免费看| 欧美日韩精品在线播放| 亚洲在线第一页| 一区二区三区高清国产| 亚洲视频999| 国产亚洲一区二区在线| 欧美一级视频在线观看| 日韩国产欧美精品在线| 丝袜亚洲欧美日韩综合| 国产一区二区香蕉| 中文字幕在线看视频国产欧美在线看完整| 欧美性猛交xxxxx水多| 色中色综合影院手机版在线观看| 日韩av电影中文字幕| 国产精品久久久久久久app| 成人写真视频福利网| 中文字幕在线看视频国产欧美在线看完整| 欧美极品美女电影一区| 亚洲精品视频中文字幕| 亚洲精品wwww| 欧美在线视频导航| 国产国产精品人在线视| 97视频在线观看网址| 国产精品夜色7777狼人| 欧美午夜影院在线视频| 欧美丰满老妇厨房牲生活| 日韩精品在线视频观看| 日韩av中文在线| 国产精品久久久久77777| 国产精品一区=区| 欧美一级淫片aaaaaaa视频| 日韩在线播放av| 亚洲男人第一网站| 日本国产一区二区三区| 欧美成人免费va影院高清| 中文国产成人精品久久一| 久久精品视频免费播放| 中文字幕av一区二区三区谷原希美| 4p变态网欧美系列| 亚洲区在线播放| 97久久精品在线| 欧美亚洲激情视频| 国产午夜精品理论片a级探花| 欧美高清理论片| 国产午夜精品理论片a级探花| 51精品国产黑色丝袜高跟鞋| 中文字幕在线视频日韩| 成人免费直播live| 国产在线a不卡| 另类视频在线观看| 欧美在线观看网址综合| 国产精品欧美在线| 在线播放国产一区二区三区| 欧美成人在线免费| 亚洲级视频在线观看免费1级| 欧美精品在线极品| 亚洲美女视频网| 国产精品扒开腿爽爽爽视频| 亚洲美女av在线播放| 色www亚洲国产张柏芝| 国产精品女人网站| 国产精品aaaa| 亚洲一区av在线播放| 日韩欧美高清视频| 国语自产精品视频在线看抢先版图片| 成人h视频在线观看播放| 久久久久久69| 亚洲成人黄色网| 久久躁日日躁aaaaxxxx| 国产精品香蕉av| 亚洲国产精彩中文乱码av在线播放| 亚洲一区精品电影| 亚洲激情在线观看| 精品在线观看国产| 亚洲欧美一区二区三区在线| 亚洲美女免费精品视频在线观看| 5278欧美一区二区三区| 亚洲精品日产aⅴ| 5566成人精品视频免费| 亚洲无限乱码一二三四麻| 欧美激情国产日韩精品一区18| 久久久久日韩精品久久久男男| 日韩美女视频免费看| 亚洲丝袜av一区| 成人性生交大片免费看视频直播| 国产精品电影一区| 成人妇女免费播放久久久| 国产欧美日韩亚洲精品| 欧美又大粗又爽又黄大片视频| 热re91久久精品国99热蜜臀| 国产美女精品免费电影| 欧美精品videos另类日本| 亚洲精品久久久久久久久久久| 中日韩午夜理伦电影免费| 久久激情视频久久| 国产一区二区日韩精品欧美精品| 日韩精品在线视频观看| 国产成人免费av| 亚洲成av人片在线观看香蕉| 日韩一区二区久久久| 国产99久久精品一区二区| 中国china体内裑精亚洲片| 精品国产一区二区三区久久久狼| 国产精品国产亚洲伊人久久| 亚洲夜晚福利在线观看| 亚洲国产成人久久综合| 97在线精品国自产拍中文| 欧美精品在线播放| 国产精品∨欧美精品v日韩精品| 日韩av三级在线观看| 欧美成人性生活| 成人观看高清在线观看免费| 欧美一级大片视频| 国产精品成人免费视频| 亚洲国产三级网| 欧美成人精品h版在线观看| 成人h视频在线观看播放| 亚洲天堂av网| 亚洲一品av免费观看| 色婷婷综合久久久久|