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文件中)。
{
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
}
};
{
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兩個方法的執行的前後。