aop有些特有的概念,如:advisor、advice和pointcut等等,使用或配置起來有點繞,讓人感覺有些距離感,其實它的實現就是一組標準的設計模式的組合使用:factory、proxy、chain of responsibility,只要搞清楚這幾個設計模式,讀aop的原始碼是比較容易的。
首先看看proxyfactorybean這個類,這是aop使用的入口,從aop拿到的bean object就是proxyfactorybean.getobject得到的,從這條線下去,發現aop就是通過proxy模式從實際要執行的target做了包裝,而proxy還不止一套方案,通過factory封裝了兩套proxy實現方案:jdk 動態proxy和cglib proxy。有兩套實現主要是因為jdk 動態proxy必須要target實現某個介面,如果不滿足這個條件就會用cglib增強位元組碼的方式來實現proxy。
就拿jdk proxy為例,spring aop使用了標準的jdk提供的動態proxy方案,我們先看看標準的動態proxy是什麼樣子,看下面類圖:
cilent通過proxy.newproxyinstance(classloader, proxiedinte***ces, invocationhandler);就能拿到target的proxy object,在執行target的方法時就會先執行到dynamicproxy中的invoke方法從而實現**包裝。基於這個道理來看spring aop的實現,實際上就是標準地基於這個方式來做的,spring aop的所有花招都體現在jdkdynamicaopproxy.invoke中(當然在cglib中是通過callback來做的,道理類似)。
通過看jdkdynamicaopproxy.invoke的原始碼會發現,spring aop的各種花招是通過chain of responsibility模式串起來的,先看看乙個標準的chain of responsibility是什麼樣子,看下面的類圖:
而chain of responsibility的關鍵在於invocation與interceptor的配合,主要原則就兩條:
1)invocation需要維護interceptor集合和游標,每次呼叫invoke時需要先呼叫游標所在的interceptor.invoke,如果游標已超過最後乙個interceptor,則呼叫實際target的方法
2)interceptor的invoke中除了要執行自己的攔截邏輯,還要通過invocation.invoke把呼叫傳遞下去,攔截的靈活性就體現在invocation.invoke執行與否和執行的順序。
以上邏輯通過時序圖來看,如下圖所示:
理解chain of responsibility後再來看spring aop,jdkdynamicaopproxy.invoke做的事情就是以上client做的事情,
1)首先通過this.advised.getinterceptorsanddynamicinterceptionadvice(method, targetclass);組裝interceptor chain
2)然後new reflectivemethodinvocation(proxy, target, method, args, targetclass, chain);得到invocation
3)最後通過invocation.proceed();啟動責任鏈
而spring aop的那些概念都體現在組裝interceptor chain中,advisor、advice和pointcut無非就是幫助你描述如何對target進行攔截,對這一塊感興趣的朋友可以好好讀讀裡面的**。另外,spring aop提供了各種各樣的interceptor,來實現各種形式的橫切,具體做法可以詳細看看各interceptor的實現。
綜上所述,整個流程如下圖所示:
總之,把握了factory、proxy、chain of responsibility的運用也就把握了spring aop的實現原理,道理雖然簡單,但其中的精髓和原由還是值得我們繼續深思的。
Spring原始碼解析之 Aop原始碼解析(2)
spring aop 更多的是oop開發模式的乙個補充,幫助oop以更好的方式來解決對於需要解決業務功能模組之上統一管理 的功能 以一副圖來做為aop功能的說明更直觀些。對於類似系統的安全檢查,系統日誌,事務管理等相關功能,物件導向的開發方法並沒有更好的解決方法 aop引入了一些概念。更多的是spr...
spring原始碼,AOP的使用
1.aop是什麼 網路上很多解釋,本文不在贅述,大致意思就好比,比如你乙個月前開發了乙個 功能就是乙個除法功能,而現在,你想在原有除法功能基礎上,記錄傳入的引數 除數,被除數 到資料庫,並且在除法功能完成後,記錄一下返回值到資料庫。按照以前的邏輯是需要到這個除法功能裡面,修改原有 當然,這個除法功能...
spring中aop原始碼理解 一
spring中aop涉及的類我們衝 annotationawareaspectjautoproxycreator我們看下它的繼承結構 由於它實現了beanpostprocessor介面所有在獲取bean時可以進行一定的處理,aop正是利用這個特性來做的,public object postproce...