AOP

核心概念

advice:通知,就是你想要實(shí)現(xiàn)的功能,比如日志、事務(wù)
JoinPoint:切點(diǎn),理解為需要切入的方法
Pointcut:切入點(diǎn)部脚,理解為需要切入的方法的位置
Aspect(Advisor): Aspect=advice+Pointcut,切面=干什么+在哪干

AOP源碼解析

AOP切面方法調(diào)用流程分析

1桨仿、解析注解獲取所有的通知advisor列表
2睛低、根據(jù)通知列表構(gòu)造增強(qiáng)鏈chain,對(duì)原始方法進(jìn)行增強(qiáng)服傍。這一過(guò)程通過(guò)調(diào)用時(shí)執(zhí)行ReflectiveMethodInvocation.proceed方法實(shí)現(xiàn)钱雷。
3、DynamicAdvisedInterceptor是enhance的interceptor吹零。負(fù)責(zé)構(gòu)造MethodInvocation并調(diào)用proceed方法罩抗。把對(duì)原始方法的調(diào)用委托給methodInvocation。
4灿椅、MethodInvocation里面是aop的interceptor套蒂。aop的interceptor接口如下

public interface MethodInterceptor extends Interceptor {
    Object invoke(MethodInvocation invocation) throws Throwable;
}

常見(jiàn)的aop的Interceptor有:MethodBeforeAdviceInterceptor,AfterAdviceInterceptor,AspectJAroundAdvice,AspectJAfterReturningAdvice茫蛹,AspectJAfterThrowingAdvice
5操刀、通過(guò)method.invoke實(shí)現(xiàn)切面方法的調(diào)用

判斷一個(gè)類(lèi)是否需要增強(qiáng)以及增強(qiáng)哪些切面

AbstractAutoProxyCreator有如下重要屬性:
advisedBeans:保存哪些bean需要增強(qiáng)。對(duì)應(yīng)的bean的方法中滿(mǎn)足advises增強(qiáng)太條件的那些bean
advisorsCache:通知緩存婴洼,key為通知名(logAspecct)骨坑,value為該通知對(duì)應(yīng)的Advisor列表
1、AbstractAutoProxyCreator.postProcessAfterInitialization會(huì)檢查每個(gè)bean通過(guò)wrapIfNecessary判斷是否需要生成代理類(lèi);
2欢唾、findCandidateAdvisors找出所有的advised:找出所有含有@Aspect注解的bean且警;過(guò)濾出該類(lèi)中非@Pointcut注解的方法,每個(gè)方法都封裝成一個(gè)Advisor礁遣,并放入advisorsCache斑芜;
3、過(guò)濾出可匹配當(dāng)前bean的advsior祟霍,調(diào)用AopUtils.findAdvisorsThatCanApply.

類(lèi)增強(qiáng)的代碼實(shí)現(xiàn)

參考CglibAopPoxy.getProxy方法
ProxyFactory構(gòu)造時(shí)候傳入TargetSource
1杏头、從TargetSource獲取待增強(qiáng)的目標(biāo)類(lèi)
2、檢查類(lèi)增強(qiáng)限制:非final類(lèi)浅碾,非final方法
3大州、Enhancer的Interceptor:SpringProxy(標(biāo)識(shí)是否是spring aop產(chǎn)生的代理類(lèi))和Advised续语。
4垂谢、Enhancer的Callbacks設(shè)置,該數(shù)組共有7個(gè)元素:StaticUnadvisedInterceptor。
5疮茄、設(shè)置Enhancer的ProxyCallbackFilter滥朱。
DynamicAdvisedInterceptor
StaticunadvisedInterceptor
SerializableNoOp:對(duì)應(yīng)final,不做增強(qiáng)
EqualsInterceptor

DynamicAdvisedInterceptor方法

每個(gè)待增強(qiáng)的方法都會(huì)操作一遍
1力试、調(diào)用getInterceptorsAndDynamicInterceptionAdvice徙邻,構(gòu)造攔截的chain。
2畸裳、aop各個(gè)advise的調(diào)用在ReflectiveMethodInvocation.proceed
3缰犁、ReflectiveMethodInvocation封裝了chain列表,和index指示器怖糊,會(huì)遞歸調(diào)用全部的interceptors帅容。
4、調(diào)用的第一個(gè)aopinterceptor是ExposeInvocationInterceptor,用于保存MethodInvocation上下文伍伤,該interceptor優(yōu)先級(jí)最高并徘,值最小,最先執(zhí)行

Objenesis Vs class.newInstance

從以上代碼可以發(fā)現(xiàn)class構(gòu)造器需要參數(shù)扰魂,而Objenesis可以繞過(guò)去麦乞, Objenesis主要應(yīng)用場(chǎng)景:

  1. 序列化装诡,遠(yuǎn)程調(diào)用和持久化 -對(duì)象需要實(shí)例化并存儲(chǔ)為到一個(gè)特殊的狀態(tài)倔幼,而沒(méi)有調(diào)用代碼绽族。
  2. 代理擂送,AOP庫(kù)和Mock對(duì)象 -類(lèi)可以被子類(lèi)繼承而子類(lèi)不用擔(dān)心父類(lèi)的構(gòu)造器选浑。
  3. 容器框架 -對(duì)象可以以非標(biāo)準(zhǔn)的方式被動(dòng)態(tài)實(shí)例化惩歉。
    詳細(xì)參考:https://blog.csdn.net/codershamo/article/details/52015206

生成代理對(duì)象AopProxy

有兩種方式CglibAopProxy和JdkDynamicAopProxy
ApplicationContext.refresh->registerBeanPostProcessors
aop源碼分析:https://zhuanlan.zhihu.com/p/35135042

jdk動(dòng)態(tài)代理

InvocationHandler = {}
People proxy = (People)Proxy.newProxyInstance(handler.getClass().getClassLoader(), people.getClass().getInterfaces(), handler);

cglib增強(qiáng)原理

cglib詳解:https://blog.csdn.net/zghwaicsdn/article/details/50957474
cglib用法樣例

public class ServiceCgInterceptor implements MethodInterceptor {

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("before");
        Object ret = methodProxy.invokeSuper(o, objects);//調(diào)用原始
        System.out.println("after");
        return ret;
    }

    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(ServiceCg.class);
        enhancer.setCallback(new ServiceCgInterceptor());
        ServiceCg proxy = (ServiceCg) enhancer.create();
        proxy.say1();
    }
}

如果增強(qiáng)一個(gè)類(lèi)需要用到多個(gè)Interceptor浸锨,實(shí)現(xiàn)如下:

enhancer.setCallbacks(cbarray);
enhancer.setCallbackFilter(callbackFilter); //CallbackFilter返回對(duì)應(yīng)callback的index

原理詳解

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末榨咐,一起剝皮案震驚了整個(gè)濱河市百侧,隨后出現(xiàn)的幾起案子砰识,更是在濱河造成了極大的恐慌能扒,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辫狼,死亡現(xiàn)場(chǎng)離奇詭異初斑,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)膨处,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)见秤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人真椿,你說(shuō)我怎么就攤上這事鹃答。” “怎么了突硝?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵测摔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我解恰,道長(zhǎng)锋八,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任护盈,我火速辦了婚禮挟纱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腐宋。我一直安慰自己紊服,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布胸竞。 她就那樣靜靜地躺著欺嗤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪撤师。 梳的紋絲不亂的頭發(fā)上剂府,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音剃盾,去河邊找鬼腺占。 笑死,一個(gè)胖子當(dāng)著我的面吹牛痒谴,可吹牛的內(nèi)容都是我干的衰伯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼积蔚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼意鲸!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤怎顾,失蹤者是張志新(化名)和其女友劉穎读慎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體槐雾,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夭委,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了募强。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片株灸。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖擎值,靈堂內(nèi)的尸體忽然破棺而出慌烧,到底是詐尸還是另有隱情,我是刑警寧澤鸠儿,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布屹蚊,位于F島的核電站,受9級(jí)特大地震影響捆交,放射性物質(zhì)發(fā)生泄漏淑翼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一品追、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冯丙,春花似錦肉瓦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至船殉,卻和暖如春鲫趁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背利虫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工挨厚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糠惫。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓疫剃,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親硼讽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子巢价,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 本文是我自己在秋招復(fù)習(xí)時(shí)的讀書(shū)筆記,整理的知識(shí)點(diǎn),也是為了防止忘記壤躲,尊重勞動(dòng)成果城菊,轉(zhuǎn)載注明出處哦!如果你也喜歡碉克,那...
    波波波先森閱讀 12,294評(píng)論 6 86
  • 本博中關(guān)于spring的文章:Spring IOC和AOP原理役电,Spring事務(wù)原理探究,Spring配置文件屬性...
    Maggie編程去閱讀 4,104評(píng)論 0 34
  • **** AOP 面向切面編程 底層原理 代理C拚汀7ㄉ! 今天AOP課程1唁奢、 Spring 傳統(tǒng) AOP2霎挟、 Spri...
    luweicheng24閱讀 1,369評(píng)論 0 1
  • 前言 說(shuō)是Java web酥夭,Spring已經(jīng)成為了事實(shí)標(biāo)準(zhǔn),Spring原理的深入學(xué)習(xí)脊奋,無(wú)論是在工作中熬北,還是在面試...
    老呼閱讀 16,901評(píng)論 2 87
  • 早上起床后發(fā)現(xiàn)昨天晚上因沒(méi)和宿管老師對(duì)接好久又,所以有未接來(lái)電巫延,慶幸沒(méi)有任何意外發(fā)生,但早上自己醒來(lái)后心情一直處于極度...
    小幸甫閱讀 331評(píng)論 0 0