spring框架AOP實現及應用場景


一、AOP是一種思想,如何實現AOP?

1、靜態AOP:在編譯期,切面直接以字節碼的形式編譯到目標字節 碼文件中。
AspectJ屬於靜態AOP,是在編譯時進行增強,會在編譯的時候將AOP邏輯織入到代碼中,需要專有的編譯器和織入器。
優點:被織入的類性能不受影響。
缺點:不夠靈活

2、動態AOP(JDK動態代理):在運行期,目標類加載后,為接口動態生成代理類,將切面植入到代理類中。
Java從1.3引入動態代理。實現原理是為被代理的業務接口生成代理類,將AOP邏輯寫入到代理類中,在運行時動態織入AOP,使用反射執行織入的邏輯。
主要實現方式依賴java.lang.reflect包下的InvocationHandler和Proxy類。
優點:Java標准庫原生支持,使用簡單,無需引用額外的包。相對於靜態AOP更靈活。
缺點:帶代理的類必須是接口,靈活性受到一些限制;使用反射會影響一些性能。

3、動態代碼字節生成:在運行期,目標類加載后,動態構建字節碼文件生成目標類的子類,將切面邏輯加入到子類中。
CGLib是動態代碼字節生成的實現,它封裝字節碼生成工具Asm,原理是在運行期間目標字節碼加載后,生成目標類的子類,將切面邏輯加入到子類中,所以使用Cglib實現AOP不需要基於接口。
優點:沒有接口也可以織入,靈活性高。
缺點:擴展類的實例方法為final時,則無法進行織入

4、自定義類加載器:在運行前,目標加載前,將切面邏輯加到目標字節碼中。
可以考慮javassist來實現。Javassist 是一個編輯字節碼的框架,可以讓你很簡單地操作字節碼。它可以在運行期定義或修改Class。使用Javassist實現AOP的原理是在字節碼加載前直接修改需要切入的方法。
優點:可以對絕大部分類織入。
缺點:如果用到了其他類加載器,則這些類將不被織入

二、AOP在哪些地方使用?

AOP的優點
1.降低模塊之間的耦合度。
2.使系統容易擴展。
3.更好的代碼復用。

AOP的應用場景
1.日志處理
2.用戶登錄
3.權限(Authentication )
4.性能優化(Performance optimization)
5.事務(Transactions )
6.記錄跟蹤 優化 校准(logging, tracing, profiling and monitoring)
7.調試(Debugging)
8.懶加載(Lazy loading)
9.錯誤處理(Error handling)
10.資源池(Resource pooling)
11.同步(Synchronization)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM