close
關注我,回復關鍵字「spring」,
免費領取Spring學習資料。

本篇旨在讓讀者對Spring AOP實現原理有一個宏觀上的認識,因此會丟失一些細節,閱讀本篇文章前,希望讀者對Spring Ioc以及Spring AOP的使用(@Aspect)由一定了解,話不多說,直接上圖!

準備工作
Service類:有find方法跟save方法,find方法前後需要緩存操作,save方法前後需要事務操作
CacheableAspect切面類:用於在Service的find方法前後進行緩存操作
TransctionlAspect切面類:用於在Service的save方法進行事務操作
LogAspect切面類:記錄所有Controller的請求日誌
Spring AOP自動代理時機

在service bean的創建過程中(也就是getBean("service")),AOP通過BeanPostProcess後置處理器操作進行介入 分為2種情況:

用戶自定義了targetSource,則bean的創建(實例化、填充、初始化)均由用戶負責,Spring Ioc不會在管該代理目標對象traget,這種情況基本上不會發生,很多人用了幾年Spring可能都不知道有它的存在
正常情況下都是Spring Ioc完成代理對象target的實例化、填充、初始化。然後在初始化後置處理器中進行介入,對bean也就是service進行代理
創建代理操作wrapIfNecessary

所有的重點都在wrapIfNecessary做了什麼操作

代理的方法調用

創建完代理,代理如果調用方法呢?我們以Jdk動態代理為例子,方法的調用將會觸發invoke方法。

Spring AOP攔截器的執行順序

從上面可以看出,Spring AOP的代理invoke方法,其實是攔截器的執行。

我們先了解一下Spring AOP的執行順序,跟棧很像,後進先出

AOP攔截器執行原理

那麼這個攔截器鏈又如何保證before在after之前呢?而且還能保證find方法的執行順序?

這部分實現原理通過幾句話是解釋不完的,只能給出圖大家了解個大概

具體攔截器源碼:

publicclassMethodBeforeAdviceInterceptorimplementsMethodInterceptor,BeforeAdvice,Serializable{privatefinalMethodBeforeAdviceadvice;@OverridepublicObjectinvoke(MethodInvocationmi)throwsThrowable{//先調用before方法this.advice.before(mi.getMethod(),mi.getArguments(),mi.getThis());//繼續鏈式調用returnmi.proceed();}}publicclassAfterReturningAdviceInterceptorimplementsMethodInterceptor,AfterAdvice,Serializable{privatefinalAfterReturningAdviceadvice;@OverridepublicObjectinvoke(MethodInvocationmi)throwsThrowable{//先進行鏈式調用ObjectretVal=mi.proceed();//再調用afterReturning方法this.advice.afterReturning(retVal,mi.getMethod(),mi.getArguments(),mi.getThis());returnretVal;}}壓軸題:Spring AOP遇上循環依賴

該部分難度係數十顆星,算是Spring源碼最複雜的一塊,這塊弄懂可以說對Spring的理解已經達到阿里水準了。這裡三言兩語是不可能解釋清楚的,只能貼個圖,大家有個宏觀上的認知。

總結

Spring AOP是Spring重要的組成部分之一,本篇只是給讀者宏觀上的一個認識,具體還是需要閱讀源碼。

來源:bugpool.blog.csdn.net/article/details/105352273



END


如何優雅的自定義 ThreadPoolExecutor 線程池?
加班到六點半,被經理約談?
詳解 Java 17中的新特性:「密封類」
Spring Boot 內置工具類應有盡有, 建議收藏!!
超鏈接的預加載神器:FasterChrome

關注後端面試那些事,回復【2022面經】

獲取最新大廠Java面經


最後重要提示:高質量的技術交流群,限時免費開放,今年抱團最重要。想進群的,關注SpringForAll社區,回復關鍵詞:加群,拉你進群。




點擊「閱讀原文」領取2022大廠面經
↓↓↓
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()