天天看點

AOP 實作的原理簡析

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的實作機制,可以更加深入的了解技術本質,同時更好的運用這個技術.

​​

AOP 實作的原理簡析