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

你可能感兴趣的:(java-AOP彻底解析)