Spring AOP 的局限性
1、只能操作 bean 对象的方法
因为使用BeanPostProcessor 需要是 spring 的 bean,才能被处理
2、无法操作静态方法
因为Spring AOP的两种实现方式:Cglib和JDK动态代理,分别是通过生成目标类的子类和实现目标接口的方式来创建动态代理的,而静态方法不能被子类重写,更谈不上接口实现。
3、方法只有被外部调用才生效,被内部自己调用(this.xxxxx())的方式,无法生效切面
4、无法织入 private 方法(cglib)
本质原因:
Spring Aop 的 jvm 的运行时技术,class 已经生成,spring无法修改 class,只能 通过子类继承、接口扩展的方式生成一个新类,再替换原有的 bean。
Agent 技术的原理
PreMain 方式
jdk1.5 后就有了,给 JVM 提供的扩展点,用于对 class 进行修改,可以在启动时直接修改 class 内容。比较原始
使用本方法分三步:
1、实现方法
public static void premain(String args, Instrumentation instrumentation){�
}
2、打包,将实现的类信息打包到 META-INF/MANIFEST.MF 中,并设置Premain-Class 为 实现的类
3、运行,添加参数
-javaagent:/path/to/jar/myAgent.jar=自定义参数字符串
Agent 方式
jdk1.6 之后才有的,用于在 jvm 启动之后执行类的转换方法
arthas 就是使用的这种方法