proxyfactorybean實現較aspectj那部分實現要簡單,他的使用基本上沒有依賴到其他第三方JAR 包,基本上spring 寫了這一塊的內容。查看這部分內容,對於aop的了解是足夠的。
詳解前小結:
1.ajpectj那塊相比於proxyfactorybean的切面執行順序有不同,aspectj是將切面的執行順序進行了排序,並且對於相同類型的切面可以進行排序,其執行順序

而proxyfactorybean中的切面執行順序需要自己手動自定,他是按照添加的順序,依次執行,如開始執行的可能是after ->before->around->after->around->before等順序,其使用時,不具體指定的話,容易出現問題,但也可以因為其靈活性進行更好自定義,(自定義這個東西,盡量不要用,除非有很大的效果,不然對因后期的人員流動,而導致維護苦難,而且性能也可能因考慮不周到導致出現問題。)
2.proxyfactorybean可以在需要執行時,動態添加一些特定的東西(將這個類定義為原型,然后每次獲取添加不同的處理切面),從而實現不同的效果。aspectj源碼過於龐大,現暫無能力去了解,所以這一點可能不是有那么准確。
詳情:
ProxyFactoryBean
- 類路徑:org.springframework.aop.framework.ProxyFactoryBean
- 類結構圖:

- 基本類介紹:
TargetClassAware:為了獲取這次所要代理的類
Advised:基本類,實現這個接口獲取所有的代理配置信息
ProxyConfig:代理信息
AdvisedSupport:代理的超類,用於后續使用方便
ProxyCreatorSupport:這個相當於一個適配器,用於講配置值給代理工廠(AopProxyFactory
aopProxyFactory 默認值為
DefaultAopProxyFactory),讓代理工廠根據配置返回不同的代理(jdk動態接口代理,cglib動態類繼承代理),而且提供監聽器(需實現AdvisedSupportListener),在創建代理前和修改配置時給監聽器發送信息。
Aware:標記性接口,
FactoryBean:主要接口,proxyfactorybean使用入口便是此接口的getobject方法。
BeanFactoryAware:提供beanfactory 的賦值方法,
BeanClassLoaderAware:類加載器設置接口,(
雖然知道加載器是雙親委托機制,但是在線程運行時,我不知道這個為何還需要自己設置,使用同級加載器,如果找不到,設置別的加載器便可以嗎?
)
advised,切面獲取和拼接切面。
上面的proxyfactorybean做的功能,不多,他只是將配置信息獲取,使用代理,返回代理對象,
aop主要重點內容說是如果根據你所寫配置一個一個的連接器,然后將讓執行真正的方法前,按序調用攔截器,
PS:攔截器鏈這種實現方式,在很多地方都可以用到,如springmvc的攔截器,struts2的實現,還有servlet 的過濾器實現,(當然其在具體實現的邏輯上面還是有不同的方式,按照我自己的理解可以分為 自旋(在一個方法體內,自己實現調用下一個攔截器),他旋(一個類用於記錄當前攔截器,執行完畢再次,執行下一個攔截器,這種方式見得比較多如sevlet 的filter,springmvc的攔截器,struts2沒有仔細看,不清楚))
這些東西在proxyfactorybean中getobject中可見,其第一步便是
初始化adivsor 鏈 他是通過名稱到beanfactory 中獲取advices 然后轉化為advisor
- 類圖
- 基本類解析
Advisor 切面 就是條件和adivce的結合體


Advice 標記接口 代表 before after around等方法

代表每個方法,使用地點
Advised 包含多個adivor ,配置文件aopproxyconfig
Interceptor 攔截器 ,用於將符合條件的advice轉化為interceptor,然后整合成鏈
轉化過程:
advisor==>advisor.getadivce==>是否符合條件(pointcutadvisor 通過ponitcut的methodmatcher 進行匹配判斷 IntroductionAdvisor通過classfilter進行過濾判斷)==》通過狀態模式使用AdvisorAdapter變成MethodInterceptor。

public interface
AdvisorAdapter
{
boolean
supportsAdvice
(
Advice advice
)
;
MethodInterceptor getInterceptor
(
Advisor advisor
)
;
}
轉化完成后進行緩存
methodCache
=
new
ConcurrentHashMap
<>(
32
),緩存目的當然是為了下次再次使用,
現在最后一部分便是生成代理:
JdkDynamicAopProxy
ObjenesisCglibAopProxy(基於Objenesis的{@link CglibAopProxy}擴展來創建代理實例*而不調用類的構造函數。不了解)
以
JdkDynamicAopProxy來介紹生成代理對象
其實現主要是以proxy.newinstance(classloader,interfaces,invokehandler(){
invoker(object proxy, object... args,Method method){
}
}),實現,在類中,找到代理對象的所有接口,然后找到equal,hashcode方法,為了就是方便后續處理,如果找不到,就使用JdkDynamicAopProxy自定義equal或hashcode方法。
其他的方法調用,此類將其封裝成MethodInvocation,一個調用鏈,
其邏輯大概可以概括為
abcd代理一個一個的切面,target目標方法
a(b(c(d(target))))