AOP 底层技术性能测试与比较

本文探讨了Spring对AOP的支持及其局限性,深入比较了AOP底层技术如JDK动态代理、CGLIB和ASM的性能,并提供了详细的测试数据。测试显示,在创建动态代理类时,ASM最快,而在运行时,JAVAASSIST Bytecode Proxy表现出最佳性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值