到底什麼是AOP?
AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程(也叫面向方面),可以通 過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種技術。AOP實際是GoF設計模式 的延續,設計模式孜孜不倦追求的是調用者和被調用者之間的解耦,AOP可以說也是這種目標的一種實現。
定義AOP 術語
1.切面(aspect):要實現的交叉功能,是系統模塊化的一個切面或領域。如日志記錄。
2.連接點:應用程序執 行過程中插入切面的地點,可以是方法調用,異常拋出,或者要修改的字段。
3.通知:切面的實際實現,他通知系統新的 行為。如在日志通知包含了實現日志功能的代碼,如向日志文件寫日志。通知在連接點插入到應用系統中。
4.切入點:定 義了通知應該應用在哪些連接點,通知可以應用到AOP框架支持的任何連接點。
5.引入:為類添加新方法和屬性。
6.目 標對象:被通知的對象。既可以是你編寫的類也可以是第三方類。
7.代理:將通知應用到目標對象後創建的對象,應用系 統的其他部分不用為了支持代理對象而改變。
8.織入:將切面應用到目標對象從而創建一個新代理對象的過程。織入發生 在目標對象生命周期的多個點上:
編譯期:切面在目標對象編譯時織入.這需要一個特殊的編譯器.
類裝載期:切面在 目標對象被載入JVM時織入.這需要一個特殊的類載入器.
運行期:切面在應用系統運行時織入.
Spring Aop實現
用java編寫spring通知
在spring中所有的通知都是以java類的形式編寫的。切入點定義在配 置文件中編寫,所以切面代碼和配置文件對我們來說都很熟悉。
對於其他框架(Aspectj),需要特定的語法編寫,如果使 用的話,還需學習新的語言。
spring的運行時通知對象
spring在運行期創建代理,不需要特殊的編譯 器.
spring有兩種代理方式:
1.若目標對象實現了若干接口,spring使用JDK的
java.lang.reflect.Proxy類代理。 該類讓spring動態產生
一個新類,它實現了所需的接口,織入了通知,並且代理對目標對象的所有請求。
2.若目標對 象沒有實現任何接口,spring使用
CGLIB庫生成目標對象的子類。使用該方式時需要注意:
1.對接口創建代理優於對類 創建代理,因為會產生更加松耦合的系統。
對類代理是讓遺留系統或無法實現接口的第三方類庫同樣可以得到通知,這 種方式應該是備用方案。
2.標記為final的方法不能夠被通知。spring是為目標類產生子類。任何需要被通知的方法都被 復寫,將通知織入。final方法是不允許重寫的。
spring實現了aop聯盟接口。
spring只支持方法連接點:不提供屬性 接入點,spring的觀點是屬性攔截破壞了封裝。面向對象的概念是對象自己處理工作,其他對象只能通過方法調用的得到的 結果。