Aspectj的一些知識

1、起源

    AspectJ項目起源於帕洛阿爾託(Palo Alto)研究中心(縮寫爲PARC)。該中心由Xerox集團資助,Gregor Kiczales領導,從1997年開始致力於AspectJ的開發,1998年第一次發佈給外部用戶,2001年發佈1.0 release。爲了推動AspectJ技術和社團的發展,PARC在2003年3月正式將AspectJ項目移交給了Eclipse組織。

2、AspectJ是個啥

    AspectJ 是一個基於 Java 語言的 AOP 框架,提供了強大的 AOP 功能,其他很多 AOP 框架都借鑑或採納其中的一些思想。AspectJ 是 Java 語言的一個 AOP 實現,其主要包括兩個部分:第一個部分定義瞭如何表達、定義 AOP 編程中的語法規範,通過這套語言規範,我們可以方便地用 AOP 來解決 Java 語言中存在的交叉關注點問題;另一個部分是工具部分,包括編譯器、調試工具等。AspectJ 是最早、功能比較強大的 AOP 實現之一,對整套 AOP 機制都有較好的實現,很多其他語言的 AOP 實現,也借鑑或採納了 AspectJ 中很多設計。在 Java 領域,AspectJ 中的很多語法結構基本上已成爲 AOP 領域的標準。AspectJ會掃描源代碼文件,找到符合aspectj自身語法的文件(對什麼時候,在什麼地方,做什麼工作操作的定義文件,也就是對aspect的定義),對文件進行解析,然後修改目標類的代碼,最終形成修改後的目標類的.class文件。因此,可以認爲,aspectj是一種靜態的AOP實現方式(因爲編譯器已經經aspect寫入到目標類的class文件中)。

3、簡單用法示例
1)業務類: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
}

}
;
2)aspectj定義類:AuthAspect.java:
aspect AuthAspect
{
  pointcut bankMethods() : execution (
* Bank.deposit(…)) || execution (* Bank. withdraw (…));
  Object around(): bankMethods()
  
{
    
// 驗證account是否爲合法用戶
    return proceed();
  }

}
;
AspectJ編譯器將做一下事情:
    首先,AspectJ從文件列表裏取出所有的文件名,然後讀取這些文件,進行分析;
    AspectJ發現一些文件含有aspect的定義,在這個例子裏,就是AuthAspect;
    AspectJ根據這些aspect代碼生成規則,修改添加Bank文件。 AspectJ讀取AuthAspect的定義,發現了一個pointcut--bankMethods();這個pointcut的定義是execution(* Bank.deposit(…)) || execution(* Bank. withdraw (…)),表示對Bank類的deposit和withdraw方法要執行攔截。 
    AspectJ繼續讀取AuthAspect的定義,發現了一個around(),這在AspectJ中叫做Advice。Advice允許你在某個類的方法的調用之前或調用之後,加入另外的代碼。代碼中的around(),就是要加入的代碼。這段代碼要加在哪裏呢?around()後面跟了一個pointcut--bankMethods()。根據這個pointcut,AspectJ會把這段代碼加入到Bank.deposit和Bank.withdraw兩個方法的執行的前後。

發佈了18 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章