一、為什么需要AOP技術
2、打開方法A、方法B、方法C……的源代碼修改,使得方法A、方法B、方法C……去調用Advice方法。
2、源代碼無關性。
二、AOP的功能
- AOP框架在編譯階段,就對目標類進行修改,得到的class文件已經是被修改過的。生成靜態的AOP代理類(生成*.class文件已經被改掉了,需要使用特定的編譯器)。以AspectJ為代表 —— 靜態AOP框架。
- AOP框架在運行階段,動態生成AOP代理(在內存中動態地生成AOP代理類),以實現對目標對象的增強。它不需要特殊的編譯器。以Spring AOP為代表。—— 動態AOP框架。
三、實戰AspectJ
1、下載和安裝AspectJ
在命令行窗口啟動下載得到的jar文件:java -jar aspectj-1.6.10.jar,在彈出的安裝界面會先讓你選擇Java,選擇你安裝的Java目錄 即可。將該軟件(絕對綠色)安裝到指定目錄下(筆者安裝在C盤)。
將C:\Java\aspectj1.6\lib\aspectjrt.jar和aspectjtools.jar添加到 CLASSPATH環境變量中。
- bin:該路徑下存放了aj、aj5、ajc、ajdoc、ajbrowser等命令,其中ajc命令最常用,它的作用類似於javac,用於對普通Java類進行編譯時增強。
- docs:該路徑下存放了AspectJ的使用說明、參考手冊、API文檔等文檔。
- lib:該路徑下的4個JAR文件是AspectJ的核心類庫。
- 相關授權文件。
2、使用AspectJ
package com.mybry.aop.service;
public class UserService{
public int addUser(){
System.out.println("模擬添加用戶的方法。");
return 20;
}
public void validateLogin(){
System.out.println("驗證用戶登錄。");
}
}
package com.mybry.aop.service;
public class BookService{
public int addBook(String name,int price){
System.out.println("正在添加圖書,書名是:"+name+",價格是:"+price);
return 100;
}
}
package com.mybry.aop.aspectj;
public aspect AuthAspect{
// Advice
// execution(* com.mybry.aop.service.*.*(..)執行 任意返回值 改包下的任意類的任意方法形參不限
before():execution(* com.mybry.aop.service.*.*(..)){
// 對原來方法進行修改、增強。
System.out.println("----------模擬執行權限檢查----------");
}
}
package com.mybry.aop.aspectj;
public aspect TxAspect{
//around的意思就是在方法的前面和后面都加
Object around():execution(* com.mybry.aop.service.*.*(..)){
// 對原來方法進行修改、增強。
System.out.println("====模擬開啟事務====");
Object rvtVal = proceed();
System.out.println("====模擬結束事務====");
return rvtVal;
}
}
