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

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

What is AspectJ

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

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 日韩 欧美 中文 | 羞羞答答影院 | 成人福利视频在线观看 | 国产精品美女一区二区 | 免费观看一区二区三区 | 精品一区二区三区在线观看视频 | 国产精品野外av久久久 | 天天碰天天操 | 久久91精品视频 | 精品国产一区二区三区四区在线 | 成人18免费观看 | 91久久在线观看 | 免费的性生活视频 | 操操操日日日干干干 | 国产孕妇孕交大片孕 | 91看片免费版 | 日本在线观看视频网站 | 在线成人免费网站 | 国产一级在线看 | 国产成人精品午夜 | 欧产日产国产精品乱噜噜 | 视频在线中文字幕 | 91成人免费版 | 久久久久久久网站 | 全黄性性激高免费视频 | 日韩av手机在线免费观看 | 本站只有精品 | 欧美成人激情在线 | 国产1区在线观看 | 99国产精品国产免费观看 | 日韩精品久久久久久久电影99爱 | av在线看网站 | 日韩精品hd | 欧美成年人在线视频 | 国产精品999在线观看 | 成人精品一区二区 | 悠悠成人资源亚洲一区二区 | 久色免费视频 | 伦一区二区三区中文字幕v亚洲 | 亚洲国产女同久久 | 色七七网站 |