`
wenlong342
  • 浏览: 61073 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

AspectJ初解

阅读更多
2006/10/30
AspectJ入門 AspectJ入门
入門-利用Eclipse編譯AspectJ入门-利用Eclipse编译AspectJ
http://www.matrix.org.cn/resource/article/44/44423_Eclipse+AspectJ.html
如何使用AspectJ Compiler開發AspectJ程式如何使用AspectJ Compiler开发AspectJ程式
http://swanky.hsiao.googlepages.com/aspectj-with-ajc


以下出處: http://www-128.ibm.com/developerworks/cn/java/l-aspectJ/以下出处: http://www-128.ibm.com/developerworks/cn/java/l-aspectJ/
1. 序: 1.序:
AspectJ是一個代碼生成工具(Code Generator)。 AspectJ是一个代码生成工具(Code Generator)。
AspectJ語法就是用來定義代碼生成規則的語法。 AspectJ语法就是用来定义代码生成规则的语法。 您如果使用過Java Compiler Compiler (JavaCC),您會發現,兩者的代碼生成規則的理念驚人相似。您如果使用过Java Compiler Compiler (JavaCC),您会发现,两者的代码生成规则的理念惊人相似。
AspectJ有自己的語法編譯工具,編譯的結果是Java Class文件,運行的時候,classpath需要包含AspectJ的一個jar文件(Runtime lib)。 AspectJ有自己的语法编译工具,编译的结果是Java Class文件,运行的时候,classpath需要包含AspectJ的一个jar文件(Runtime lib)。

2. Aspect Oriented Programming (AOP) 2. Aspect Oriented Programming (AOP)
class Bank class Bank
{
public float deposit(AccountInfo account, float money) public float deposit(AccountInfo account, float money)
{
// 驗證account是否為合法用戶    // Begin Transaction //验证account是否为合法用户// Begin Transaction
// 增加account賬戶的錢數,返回賬戶裡當前的錢數   // End Transaction //增加account账户的钱数,返回账户里当前的钱数// End Transaction
}

public float withdraw(AccountInfo account, float money) public float withdraw(AccountInfo account, float money)
{
// 驗證account是否為合法用戶    // Begin Transaction //验证account是否为合法用户// Begin Transaction
// 減少account賬戶的錢數,返回取出的錢數    // End Transaction //减少account账户的钱数,返回取出的钱数// End Transaction
}
};
以上程式內含有商業邏輯和與系統無關的邏輯(驗證),程式碼不單單只負責一件事情,增加複雜度,減少可用性.而認證,事務等方面,就是AOP所關心的Aspect。以上程式内含有商业逻辑和与系统无关的逻辑(验证),程式码不单单只负责一件事情,增加复杂度,减少可用性.而认证,事务等方面,就是AOP所关心的Aspect。 AOP就是為瞭解決這種問題而出現的。 AOP就是为了解决这种问题而出现的。 AOP的目的就是--Separation of Aspects (or Separation of Concerns). AOP的目的就是--Separation of Aspects (or Separation of Concerns).

3.AspectJ
使用AspectJ,我們不用對原有的代碼做任何修改,就可以為代碼提供不同的Aspect(方面)--比如,認證,事務等。使用AspectJ,我们不用对原有的代码做任何修改,就可以为代码提供不同的Aspect(方面)--比如,认证,事务等。 我們只需要提供兩個不同的Aspect--認證Aspect和事務Aspect。我们只需要提供两个不同的Aspect--认证Aspect和事务Aspect。
Code 4.1 AuthAspect.java Code 4.1 AuthAspect.java
aspect AuthAspect aspect AuthAspect
{
pointcut bankMethods() : execution (* Bank.deposit(…)) || execution (* Bank. withdraw (…)); pointcut bankMethods() : execution (* Bank.deposit(…)) || execution (* Bank. withdraw (…));

Object around(): bankMethods() Object around(): bankMethods()
{
// 驗證account是否為合法用戶 //验证account是否为合法用户

return proceed(); return proceed();
}
};

Code 4.2 TransactionAspect.java Code 4.2 TransactionAspect.java
aspect TransactionAspect aspect TransactionAspect
{
pointcut bankMethods() : execution(* Bank.deposit(…)) || execution (* Bank. withdraw (…)); pointcut bankMethods() : execution(* Bank.deposit(…)) || execution (* Bank. withdraw (…));

Object around(): bankMethods() Object around(): bankMethods()
{
// Begin Transaction // Begin Transaction
Object result = proceed(); Object result = proceed();
// End Transaction // End Transaction
return result; return result;
}
};
這些aspect的定義,不過是定義了一些代碼生成規則。这些aspect的定义,不过是定义了一些代码生成规则。
我們來看看,AspectJ編譯器為我們做了什麼事情。我们来看看,AspectJ编译器为我们做了什么事情。

1. 首先,AspectJ從文件列表裡取出所有的文件名,然後讀取這些文件,進行分析。 1.首先,AspectJ从文件列表里取出所有的文件名,然后读取这些文件,进行分析。
2. AspectJ發現一些文件含有aspect的定義,在這個例子裡,就是AuthAspect和TransactionAspect的定義;這些aspect就是代碼生成規則。 2. AspectJ发现一些文件含有aspect的定义,在这个例子里,就是AuthAspect和TransactionAspect的定义;这些aspect就是代码生成规则。
3. AspectJ根據這些aspect代碼生成規則,修改添加你的源代碼。 3. AspectJ根据这些aspect代码生成规则,修改添加你的源代码。 在這個例子裡,就是修改添加Bank文件。在这个例子里,就是修改添加Bank文件。
4. AspectJ 讀取AuthAspect的定義,發現了一個pointcut--bankMethods();這個pointcut的定義是execution(* Bank.deposit(…)) || execution(* Bank. withdraw (…)),表示所有對Bank類的deposit和withdraw方法的執行點。 4. AspectJ读取AuthAspect的定义,发现了一个pointcut--bankMethods();这个pointcut的定义是execution(* Bank.deposit(…)) || execution(* Bank. withdraw (…)),表示所有对Bank类的deposit和withdraw方法的执行点。
5. AspectJ繼續讀取AuthAspect的定義,發現了一個around(),這在AspectJ中叫做Advice,我不明白為什麼叫這個名字,不過沒關係,我們只要知道它是干什麼的就行了。 5. AspectJ继续读取AuthAspect的定义,发现了一个around(),这在AspectJ中叫做Advice,我不明白为什么叫这个名字,不过没关系,我们只要知道它是干什么的就行了。 Advice允許你在某個類的方法的調用之前或調用之後,加入另外的代碼。 Advice允许你在某个类的方法的调用之前或调用之后,加入另外的代码。 Code 4.1所示代碼中的around()的" // 驗證account是否為合法用戶"部分,就是要加入的代碼。 Code 4.1所示代码中的around()的" //验证account是否为合法用户"部分,就是要加入的代码。 這段代碼要加在哪裡呢?这段代码要加在哪里呢? around()後面跟了一個pointcut-- bankMethods()。 around()后面跟了一个pointcut-- bankMethods()。 根據這個pointcut,AspectJ會把這段代碼加入到Bank.deposit和Bank.withdraw兩個方法的執行之前。根据这个pointcut,AspectJ会把这段代码加入到Bank.deposit和Bank.withdraw两个方法的执行之前。 達到的效果就如同Code 2.2所示。达到的效果就如同Code 2.2所示。
6. AspectJ讀取TransactionAspect的定義,象第(4)步一樣,發現了發現了一個pointcut--bankMethods()。 6. AspectJ读取TransactionAspect的定义,象第(4)步一样,发现了发现了一个pointcut--bankMethods()。
7. AspectJ 繼續讀取AuthAspect的定義,發現了一個around()。 7. AspectJ继续读取AuthAspect的定义,发现了一个around()。 這次AspectJ把"Begin Transaction"和"End Transaction"兩段代碼加在Bank.deposit和Bank. withdraw兩個方法的執行前後。这次AspectJ把"Begin Transaction"和"End Transaction"两段代码加在Bank.deposit和Bank. withdraw两个方法的执行前后。 達到的效果就如同Code 2.3所示。达到的效果就如同Code 2.3所示。

如何驗證這一點?如何验证这一点? 您可以到http://www.eclipse.org/aspectj/下載安裝AspectJ,編譯裡面的Sample,把編譯結果反編譯一下,就可以看到AspetJ自動生成的代碼。您可以到http://www.eclipse.org/aspectj/下载安装AspectJ,编译里面的Sample,把编译结果反编译一下,就可以看到AspetJ自动生成的代码。

我們看到,AspectJ是一種代碼自動生成工具。我们看到,AspectJ是一种代码自动生成工具。 你編寫一段通用的代碼,比如認證方面的代碼,事務方面的代碼,然後根據AspectJ語法定義一套代碼生成規則(aspect定義),AspectJ就會幫助你自動把這段通用代碼分佈到對應的代碼裡面去,簡單快捷,算無遺策。你编写一段通用的代码,比如认证方面的代码,事务方面的代码,然后根据AspectJ语法定义一套代码生成规则(aspect定义),AspectJ就会帮助你自动把这段通用代码分布到对应的代码里面去,简单快捷,算无遗策。
我們用AspectJ編譯器編譯Bank文件和含有aspect的這個文件,出來的結果就是帶有安全認證和事務處理的Bank類。我们用AspectJ编译器编译Bank文件和含有aspect的这个文件,出来的结果就是带有安全认证和事务处理的Bank类。 編譯出來的這個Bank 類調用了AspectJ Runtime Lib,所以,如果你要運行這個Bank類,你需要把AspectJ Runtime Lib設置在你的classpath裡面。编译出来的这个Bank类调用了AspectJ Runtime Lib,所以,如果你要运行这个Bank类,你需要把AspectJ Runtime Lib设置在你的classpath里面
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics