java-AOP彻底解析
AOP是一种编程范式,与语言无关,是一种程序设计思想。
面向切面编程(AOP)Aspect Oriented Programming。
切面编程的目的是为了把通用逻辑从业务逻辑分离出来。
先来看看切面的常用术语:
Join point: 拦截点,如某个业务方法。
Pointcut: Joinpoint 的表达式,表示拦截哪些方法。一个 Pointcut 对应多个 Joinpoint。
Advice: 要切入的逻辑。
BeforeAdvice 在方法前切入。
After Advice 在方法后切入,抛出异常时也会切入。
AfterReturningAdvice 在方法返回后切入,抛出异常则不会切入。
AfterThrowingAdvice 在方法抛出异常时切入。
Around Advice 在方法执行前后切入,可以中断或忽略原有流程的执行。
一些表达式示意图:
aspect常用表达式.png 表达式示意图.png
AOP实现技术:
aop实现技术.png
AOP各种实现优缺点:
各种实现优缺点.png
AOP切面代码织入时机:
1 编译期:切面在目标类编译时被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。
2 类加载期:切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器(ClassLoader),它可以在目标类被引入应用之前增 强该目标类的字节码。AspectJ 5的加载时织入(load-time weaving,LTW)就支持以这种方式织入切面
3 运行期:切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态地创建一个代理对象。Spring AOP就是以这种方式织入切面的。
Spring创建AOP代理过程!
demo例子来自 spring源码深度解析这本书。
截取 增强器提前的部分断点代码:
关键代码部分.png
Instrument静态代理!
参考:
AOP的实现机制
spring源码深度解析
spring实战第4版
深入理解类加载器相关文章
cglib