描述如何使用加载期织入
前言
织入是把切面应用到目标对象来创建新的代理对象的过程,织入有 3 种方式
- 编译期织入,在编译的时候将增强的代码加入到代理对象里,需要特殊的编译器
- 加载期织入(load-time weaving),在类加载的时候将增强的代码加入到代理对象里,需要使用 -javaagent 参数指定 agent 用于修改类的字节码
- 运行期织入,在运行期将增强的代码加入到代理对象里
在 spring 中, AOP 默认是使用运行期织入,通过 CGLIB 或 JDK 实现代理,此外也可以用 aspectj 实现加载期织入
使用 load-time weaving
在 spring 使用 load-time weaving 有两种情况。一种是 spring 的内置功能,例如 Caching 和 Async,一种是用户用 @Aspect 或 aop.xml 定义的切面
spring 的内置功能
这种情况需要将 AdviceMode 设置为 ASPECTJ,再将 javaagent 设置为 aspectjweaver.jar
1 | public class AsyncApp { |
运行命令
1 | java -javaagent:aspectjweaver-1.9.4.jar -jar myapp.jar |
使用 @Aspect 的情况
这种情况可以将 javaagent 设置为 aspectjweaver.jar , 也可以设置为 spring-instrument.jar,如果设置为 spring-instrument.jar 就需要有 @EnableLoadTimeWeaving
1 | public class AspectjApp { |
这种情况需要有 aop.xml, 即使内容为空
1 |
|
1 | java -javaagent:spring-instrument-5.1.9.RELEASE.jar -jar myapp.jar |
如果两种情况都需要使用,则可以设置两个 javaagent
1 | java -javaagent:aspectjweaver-1.9.4.jar -javaagent:spring-instrument-5.1.9.RELEASE.jar -jar myapp.jar |