java--初探AOP及AspectJ的用法
一、为什么需要AOP技术
1、先定义一个Advice方法,该方法实现这个通用性质的横切处理。
2、打开方法A、方法B、方法C……的源代码修改,使得方法A、方法B、方法C……去调用Advice方法。
2、源代码无关性。
二、AOP的功能
1、AOP框架在编译阶段,就对目标类进行修改,得到的class文件已经是被修改过的。生成静态的AOP代理类(生成*.class文件已经被改掉了,需要使用特定的编译器)。以AspectJ为代表 —— 静态AOP框架。
2、AOP框架在运行阶段,动态生成AOP代理(在内存中动态地生成AOP代理类),以实现对目标对象的增强。它不需要特殊的编译器。以Spring AOP为代表。—— 动态AOP框架。
1、下载和安装AspectJ
相关授权文件
2、使用AspectJ
public class UserService{
public int addUser(){
System.out.println("模拟添加用户的方法。");
return 20;
}
public void validateLogin(){
System.out.println("验证用户登录。");
}
}
public class BookService{
public int addBook(String name,int price){
System.out.println("正在添加图书,书名是:"+name+",价格是:"+price);
return 100;
}
}
public aspect AuthAspect{
// Advice
// execution(* com.mybry.aop.service.*.*(..)执行 任意返回值 改包下的任意类的任意方法形参不限
before():execution(* com.mybry.aop.service.*.*(..)){
// 对原来方法进行修改、增强。
System.out.println("----------模拟执行权限检查----------");
}
}
public aspect TxAspect{
//around的意思就是在方法的前面和后面都加
Object around():execution(* com.mybry.aop.service.*.*(..)){
// 对原来方法进行修改、增强。
System.out.println("====模拟开启事务====");
Object rvtVal = proceed();
System.out.println("====模拟结束事务====");
return rvtVal;
}
}