AspectJ
一套独立的面向切面编程解决方案
使用的是编译时增强
,相比spring AOP使用的是运行时增强
性能更优优势
使用举例
SayHelloService.java
---
package com.ywsc.fenfenzhong.aspectj.learn;
public class SayHelloService {
public void say(){
System.out.print("Hello AspectJ");
}
}
现在需要在say()方法后,通过AspectJ的后置增强来增加日志
LogAspect.java
---
package com.ywsc.fenfenzhong.aspectj.learn;
public aspect LogAspect{
pointcut logPointcut():execution(void SayHelloService.say());
after():logPointcut(){
System.out.println("记录日志 ...");
}
}
使用AspectJ的bin命令编译(ajc.exe可以当作增强版本的javac.exe命令)
> ajc -d . SayHelloService.java LogAspect.java
生成 SayHelloService.class
> java SayHelloService
---
输出: Hello AspectJ 记录日志
Spring AOP
AspectJ并不是spring的部分,spring仅仅使用了AspectJ的Annotation
,虽然使用了Aspect的Annotation,但是并没有使用它的编译器和织入器。使用了Aspect来定义切面,使用Pointcut来定义切入点,使用Advice来定义增强处理
spring用了2种代理技术
- JDK动态代理 利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
- CGLIB 利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
网友评论