Spring源碼解析之AOP篇

Spring AOP是我們?nèi)粘i_(kāi)發(fā)中經(jīng)常使用的工具,常被用來(lái)做統(tǒng)一的日志、異常處理、監(jiān)控等功能,使用方法在此不多贅述,有興趣的讀者可以自行去網(wǎng)上查閱資料進(jìn)行學(xué)習(xí),我們以注解的使用方式為例,分析其相關(guān)源碼,其他方式大同小異。

開(kāi)啟Spring AOP注解方式首先要配置標(biāo)簽,我們就以這個(gè)標(biāo)簽的解析作為入口來(lái)分析,這里需要讀者對(duì)Spring自定義標(biāo)簽解析的過(guò)程有一定的了解,筆者后續(xù)也會(huì)出相關(guān)的文章。鎖定AopNamespaceHandler:

這里提到了proxy-target-class和expose-proxy兩個(gè)屬性,簡(jiǎn)單介紹一下,Spring提供了JDK動(dòng)態(tài)代理和CGLIB代理兩種方式為目標(biāo)類創(chuàng)建代理,默認(rèn)情況下,如果目標(biāo)類實(shí)現(xiàn)了一個(gè)以上的用戶自定義的接口或者目標(biāo)類本身就是接口,就會(huì)使用JDK動(dòng)態(tài)代理,如果目標(biāo)類本身不是接口并且沒(méi)有實(shí)現(xiàn)任何接口,就會(huì)使用CGLIB代理,如果想強(qiáng)制使用CGLIB代理,則可以將proxy-target-class設(shè)置true,這兩種代理方式在使用的時(shí)候有一些需要注意的事項(xiàng),JDK動(dòng)態(tài)代理是基于實(shí)現(xiàn)目標(biāo)類的接口來(lái)創(chuàng)建代理類的,所以只有接口方法會(huì)被代理,其他方法不會(huì)被代理,而CGLIB代理是基于繼承目標(biāo)類實(shí)現(xiàn)的,所以不能被繼承的方法(例如final修飾的方法、private修飾的方法等)是不能被代理的,建議盡量使用JDK動(dòng)態(tài)代理的方式創(chuàng)建代理類。expose-proxy用來(lái)解決對(duì)象內(nèi)部this調(diào)用無(wú)法被切面增強(qiáng)的問(wèn)題,例如我們?cè)贏類的對(duì)象內(nèi)部x方法中調(diào)用另外一個(gè)內(nèi)部方法y時(shí),y方法不會(huì)被切面增強(qiáng),這時(shí)可以配置expose-proxy為true并將this.y()改為((A)AopContext.currentProxy()).y(),即可讓y方法被切面增強(qiáng)。

下面讓我們來(lái)看本篇文章的主角AnnotationAwareAspectJAutoProxyCreator的注冊(cè)過(guò)程。

*** 由于分析Spring源碼內(nèi)容較多,請(qǐng)?jiān)赪iFi環(huán)境下,點(diǎn)擊下方閱讀原文 ***

點(diǎn)擊閱讀原文

作者

張強(qiáng),16年加入京東,目前就職于京東商城京麥平臺(tái)組,從事京東對(duì)外開(kāi)放平臺(tái)和服務(wù)于第三方入駐商家的相關(guān)工作,開(kāi)源愛(ài)好者,對(duì)常用開(kāi)源框架如Spring、Mybatis、Dubbo等有源碼級(jí)別的了解,熱衷于研究各種技術(shù),致力于成為一名有腔調(diào)的工程師

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,500評(píng)論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,253評(píng)論 6 342
  • AOP核心概念 橫切關(guān)注點(diǎn):對(duì)哪些方法進(jìn)行攔截,攔截后怎么處理,這些關(guān)注點(diǎn)稱之為橫切關(guān)注點(diǎn)切面(aspect):類...
    lijiaccy閱讀 378評(píng)論 0 0
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,749評(píng)論 11 349
  • 最近狀態(tài)很不好,不管是精神、心態(tài)、還是工作上總感覺(jué)自己在垮掉一樣,無(wú)能為力。 其實(shí)知道如何調(diào)節(jié),不需要任何人安撫于...
    Ermao閱讀 293評(píng)論 1 1

友情鏈接更多精彩內(nèi)容