文章首發於公衆號:松花皮蛋的黑板報
做者就任於京東,在穩定性保障、敏捷開發、高級JAVA、微服務架構有深刻的理解spring
聲明一個AdvisedSupport類,用於保存被代理對象和攔截方法的元數據對象架構
建立織入點AopProxy,能夠經過getProxy方法獲取代理後的對象。使用CGLIB生成動態代理,生成Enhancer實例,並指定用於處理代理業務的回調類微服務
完成了織入以後,咱們要考慮另一個問題:對什麼類以及什麼方法進行AOP?對於「在哪切」這一問題的定義,咱們又叫作「Pointcut」。Spring中關於Pointcut包含兩個角色:ClassFilter和MethodMatcher,分別是對類和方法作匹配。Pointcut有不少種定義方法,例如類名匹配、正則匹配等,可是應用比較普遍的應該是和AspectJ表達式的方式,Spring借鑑了這種方式spa
萬事俱備,只欠東風!如今咱們有了Pointcut和Weave技術,一個AOP已經算是完成了,可是它尚未結合到Spring中去。怎麼進行結合呢?Spring給了一個巧妙的答案:使用BeanPostProcessor代理
BeanPostProcessor是BeanFactory提供的,在Bean初始化過程當中進行擴展的接口。只要你的Bean實現了BeanPostProcessor接口,那麼Spring在初始化時,會優先找到它們,而且在Bean的初始化過程當中,調用這個接口,從而實現對BeanFactory核心無侵入的擴展code
那麼咱們的AOP是怎麼實現的呢?咱們知道,在AOP的xml配置中,咱們會寫這樣一句話:xml
<aop:aspectj-autoproxy/>
它其實至關於:對象
<bean id="autoProxyCreator" class="org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator"></bean>
AspectJAwareAdvisorAutoProxyCreator就是AspectJ方式實現織入的核心。它實際上是一個BeanPostProcessor。在這裏它會掃描全部Pointcut,並對bean作織入blog
文章來源:www.liangsonghua.me
做者介紹:京東資深工程師-梁鬆華,長期關注穩定性保障、敏捷開發、JAVA高級、微服務架構接口