Spring AOP實現原始碼分析(三)

2021-09-02 20:55:24 字數 2174 閱讀 7229

spring aop的實現可以分為三大部分

1. 註冊aop功能具體實現類

2. 普通bean例項化時aop的切入

3. aop切入具體流程

下面分析beanpostprocessor執行過程中,aop如何切入,上一節講到,普通bean初始化會呼叫如下方法

// 呼叫aop的真正實現方法入口  

result = beanprocessor.postprocessafterinitialization(result, beanname);

aop此方法實際是繼承自abstractautoproxycreator, 跟蹤一下 

postprocessafterinitialization的實現

建立**實際只有兩個步驟

1. 獲取增強方法或者增強器

2. 根據獲取到的增強器進行**

// class 

@override

public object postprocessafterinitialization(object bean, string beanname) throws bean***ception

} return bean;

}protected object wrapifnecessary(object bean, string beanname, object cachekey)

首先跟蹤 獲取增強器 的邏輯

protected object getadvicesandadvisorsforbean(class> beanclass, string beanname, targetsource targetsource) 

return advisors.toarray();

}protected listfindeligibleadvisors(class> beanclass, string beanname)

return eligibleadvisors;

}

繼續跟蹤 建立** 實現  

protected object createproxy(

class> beanclass, string beanname, object specificinterceptors, targetsource targetsource)

**的真正實現呼叫過程(jdk動態**,或者cglib)不再贅述,比如動態**,最終會呼叫invoke,稍微看一下jdkdynamicaopproxy的invoke實現,內部通過chain儲存了增強器呼叫鏈,實現過程類似於職責鏈設計模式

// class jdkdynamicaopproxy

public object invoke(object proxy, method method, object args) throws throwable else

......

}public object proceed() throws throwable

// 獲取下乙個interceptor

object interceptororinterceptionadvice = this.interceptorsanddynamicmethodmatchers.get(++this.currentinterceptorindex);

......

// 這個方法,將this傳了進去,裡面的實現可以看出,實際在執行完當前interceptor的invoke方法後,接著執行this.proceed,即又呼叫回來了當前proceed方法,保證loop chain完成

return ((methodinterceptor)interceptororinterceptionadvice).invoke(this);

}// 比如 methodbeforeadviceinterceptor 的實現

@override

public object invoke(methodinvocation mi) throws throwable

Spring AOP 原始碼詳解

spring aop 是 spring 核心功能之一,日常的工作少不了和 aop 打交道 是時候有必要去了解 spring 對 aop 的封裝和其背後的原理,這樣子我們才能寫出更加高質量的 及產生 bug 的原因 什麼是 aop aop 的相關一些概念 spring aop 的使用方式 spring...

spring aop原始碼分析

面試中經常被問到什麼是aop,其實aop是一種技術實現,或者說是一種實現標準,實現aop的技術有多種,但是通常所說的aop,大家會不自覺的想到spring aop,因為spring aop被問了很多次。本文想從原始碼的執行流程上來簡單說說aop的實現原理。aop的底層技術其實就是大家熟知的 spri...

SpringAOP原始碼學習總結

1.使用 enableaspectjautoproxy啟用aop 2.建立abstractautoproxycreator 使用 enableaspectjautoproxy後,可以看到會 import aspectjautoproxyregistrar.class aspectjautoproxy...