AOP簡介
AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程(也叫面向方面),可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種技術。
AOP應用范圍
日志記錄,跟蹤,優化和監控,事務的處理,持久化,如數據庫連接池的管理,系統統一的認證、權限管理等.
AOP的實現
AOP實現可以分為兩種:
1.靜態織入(AspectJ)
在代碼的編譯階段植入Pointcut的內容 ,優點是性能好
2.動態代理(Spring)
在代碼執行階段,在內存中截獲對象,動態的插入Pointcut的內容,優點是不需要額外的編譯,但是性能比靜態織入要低
Spring AOP
在Spring 中,雖然引入了AspectJ的語法,但是他本質上使用的是動態代理的方式.但即使是動態代理,也分兩種實現模式:
1.使用接口(動態代理)
如果被代理的對象是面向接口編程的,那么Spring直接使用實現這些接口,然后把需要插入的內容在這個接口上下文中插入
2.使用繼承(CGLIB)
如果被代理的對象沒有基於接口編程,那么Spring會調用cglib庫,通過子類繼承的方式,動態插入需要的內容,並且調用父類的方法實現
cglib內部擁有一個小的字節碼處理框架asm,來轉換字節碼生成新的類.所以spring調用了cglib,相當於生成了一個被代理對象的子類,來取代被代理對象.
結語
以上只是針對動態代理的一些資料的總結和個人的理解.動態代理沒有那么神秘,同時也沒那么簡單,它深入到了java比較底層的地方,或者運用了比較高級的技術實現.通過學習和挖掘aop的實現機制,可以更加深入的了解技術本質,同時更好的運用這個技術.
參考