Spring对AOP的支持
Spring中AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IOC容器负责管理。因此,AOP代理可以直接使用容器中的其它bean实例作为目标,这种关系可由IOC容器的依赖注入提供。Spring创建代理的规则为:
1、默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了
2、当需要代理的类不是代理接口的时候,Spring会切换为使用CGLIB代理,也可强制使用CGLIB
SpringAOP局限性
只能对spring管理的bean增加aop功能
AOP 底层技术比较
AOP技术 | 功能 | 性能 | 面向接口编程 | 编程难度 | 使用场合 |
---|---|---|---|---|---|
直接编辑class 文件 | 完全控制类 | 无明显性能代价 | 不要求 | 高,要求对 class 文件结构和 Java 字节码有深刻了解 | 对class字节码结构深入了解,且只需要改动很小 |
JDK Instrument | 完全控制类 | 无论是否改写,每个类装入时都要执行 hook 程序 | 不要求 | 高,要求对 class 文件结构和 Java 字节码有深刻了解 | 更适用于监控和控制虚拟机的行为 |
JDK Proxy | 只能改写 method | 反射引入性能代价 | 要求 | 低 | |
ASM | 几乎能完全控制类 | 无明显性能代价 | 不要求 | 中,能操纵需要改写部分的 Java 字节码 |
动态代理技术的层级关系
ASM –> cglib –> springAOP
ASM –> AspectJ
javassit –> JBoss AOP
性能比较
- 创建动态代理类:
ASM>JDK Proxy >Javassist Proxy >Javassist Bytecode Proxy>Cglib Proxy
测试数据:(JDK-1.6.0_18-b07, ASM-3.3, CGLIB-2.2, JAVAASSIST-3.11.0.GA )
Create JDK Proxy: 13 ms
Create CGLIB Proxy: 182 ms
Create JAVAASSIST Proxy: 96 ms
Create JAVAASSIST Bytecode Proxy: 111 ms
Create ASM Proxy: 2 ms测试数据:(JDK-1.7.0_79, ASM-3.3.1, CGLIB-2.2, JAVAASSIST-3.12.0.GA )
Create JDK Proxy: 13 ms
Create CGLIB Proxy: 217 ms
Create JAVAASSIST Proxy: 99 ms
Create JAVAASSIST Bytecode Proxy: 168 ms
Create ASM Proxy: 3 ms
- 运行动态代理类:
Javassist Bytecode Proxy>ASM >Cglib > JDK > Javassist Proxy
测试数据:
(JDK-1.6.0_18-b07, ASM-3.3, CGLIB-2.2, JAVAASSIST-3.11.0.GA )
Run JDK Proxy: 2224 ms, 634,022 t/s
Run CGLIB Proxy: 1123 ms, 1,255,623 t/s
Run JAVAASSIST Proxy: 3212 ms, 438,999 t/s
Run JAVAASSIST Bytecode Proxy: 206 ms, 6,844,977 t/s
Run ASM Bytecode Proxy: 209 ms, 6,746,724 t/s测试数据:(JDK-1.7.0_79, ASM-3.3.1, CGLIB-2.2, JAVAASSIST-3.12.0.GA )
Run JDK Proxy: 105 ms, 13,429,194 t/s
Run CGLIB Proxy: 87 ms, 16,207,648 t/s
Run JAVAASSIST Proxy: 431 ms, 3,271,613 t/s
Run JAVAASSIST Bytecode Proxy: 56 ms, 25,179,739 t/s
Run ASM Bytecode Proxy: 67 ms, 21,045,752 t/s
注:左侧为更底层,右侧为更高层
- 差异原因:
各方案生成的字节码有很大区别,其中JDK和CGLIB在实现时包装了自己的一些类,逻辑比较复杂,所以生成的字节码非常大,而用javassist和asm生成的字节码非常小,所以速度快。
参考资料:
http://javatar.iteye.com/blog/814426/
https://www.ibm.com/developerworks/cn/java/j-lo-asm30/