国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 禄劝| 峨眉山市| 醴陵市| 桑植县| 蒙自县| 贵州省| 宜丰县| 兴国县| 福州市| 乌兰察布市| 南澳县| 务川| 涿鹿县| 格尔木市| 彰武县| 莱阳市| 青海省| 沂源县| 清苑县| 新竹市| 清丰县| 商丘市| 宁国市| 博罗县| 嵊泗县| 黎平县| 贵南县| 个旧市| 灯塔市| 仙游县| 华蓥市| 奉新县| 综艺| 沙坪坝区| 钦州市| 叙永县| 和平县| 安达市| 通道| 吉安市| 左权县|