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/