av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Spring AOP底層源碼詳解

瀏覽:5日期:2023-07-19 10:33:00
ProxyFactory的工作原理

ProxyFactory是一個(gè)代理對(duì)象生產(chǎn)工廠(chǎng),在生成代理對(duì)象之前需要對(duì)代理工廠(chǎng)進(jìn)行配置。ProxyFactory在生成代理對(duì)象之前需要決定到底是使用JDK動(dòng)態(tài)代理還是CGLIB技術(shù)。

// config就是ProxyFactory對(duì)象// optimize為true,或proxyTargetClass為true,或用戶(hù)沒(méi)有給ProxyFactory對(duì)象添加interfaceif (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) { Class<?> targetClass = config.getTargetClass(); if (targetClass == null) { throw new AopConfigException('TargetSource cannot determine target class: ' +'Either an interface or a target is required for proxy creation.'); } // targetClass是接口,直接使用Jdk動(dòng)態(tài)代理 if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy(config); } // 使用Cglib return new ObjenesisCglibAopProxy(config);}else { // 使用Jdk動(dòng)態(tài)代理 return new JdkDynamicAopProxy(config);}JdkDynamicAopProxy創(chuàng)建代理對(duì)象過(guò)程 獲取生成代理對(duì)象所需要實(shí)現(xiàn)的接口集合 獲取通過(guò)ProxyFactory.addInterface()所添加的接口,如果沒(méi)有通過(guò)ProxyFactory.addInterface()添加接口,那么則看ProxyFactory。setTargetClass()所設(shè)置的targetClass是不是一個(gè)接口,把接口添加到結(jié)果集合中,同時(shí)把SpringProxy、Advised、DecoratingProxy這幾個(gè)接口也添加到結(jié)果集合中去。 確定好要代理的集合之后,就利用Proxy.newProxyInstance()生成一個(gè)代理對(duì)象。 JdkDynamicAopProxy創(chuàng)建代理對(duì)象執(zhí)行過(guò)程 如果通過(guò)ProxyFactory.setExposeProxy()把exposeProxy設(shè)置為true,那么則把代理對(duì)象設(shè)置到一個(gè)ThreadLocal(currentProxy)中去。 獲取通過(guò)ProxyFactory所設(shè)置的target,如果設(shè)置的是targetClass,那么target將為null 根據(jù)當(dāng)前所調(diào)用的方法對(duì)象尋找ProxyFactory中所添加的并匹配的Advisor,并且把Advisor封裝為MethodInterceptor返回,得到MethodIntercepter鏈叫做chain 如果chain為空,則字節(jié)執(zhí)行target對(duì)應(yīng)的當(dāng)前方法,如果target為null會(huì)報(bào)錯(cuò) 如果chain不為空,則會(huì)依次執(zhí)行chain中的MethodInterceptor。如果當(dāng)前MethodInterceptor是MethodBeforeAdviceInterceptor,那么先執(zhí)行Advisor中所advice的before()方法,然后執(zhí)行下一個(gè)MethodInterceptor.如果當(dāng)前MethodInterceptor是AfterReturningAdviceInterceptor,那么先執(zhí)行執(zhí)行下一個(gè)MethodInterceptor。拿到返回值后,再執(zhí)行Advisor中所advice的afterReturning()方法 ObjenesisCglibAopProxy創(chuàng)建代理對(duì)象過(guò)程 創(chuàng)建Enhancer 設(shè)置Enhancer的superClass為通過(guò)ProxyFactory.setTarget()所設(shè)置的對(duì)象的類(lèi) 設(shè)置Enhancer的interfaces為通過(guò)ProxyFactory.addInterface()所添加的接口,以及SpringProxy、Advisor接口 設(shè)置Enhancer的Callbacks為DynamicAdvisedIntercepter 最后通過(guò)Enhancer創(chuàng)建一個(gè)代理對(duì)象 ObjenesisCglibAopProxy創(chuàng)建的代理對(duì)象執(zhí)行過(guò)程

執(zhí)行過(guò)程主要就看DynamicAdvisedInterceptor中的實(shí)現(xiàn),執(zhí)行邏輯和JdkDynamicAopProxy中是一樣的。

自動(dòng)代理(autoproxy)功能

“自動(dòng)代理”表示只需要在Spring中添加某個(gè)Bean,這個(gè)Bean是一個(gè)BeanPostProcessor,那么Spring在每創(chuàng)建一個(gè)Bean時(shí),都會(huì)經(jīng)過(guò)這個(gè)BeanPost Processor的判斷,去判斷當(dāng)前正在創(chuàng)建的這個(gè)Bean是不是需要進(jìn)行AOP。

DefaultAdvisorAutoProxyCreator

AbstractAutoProxyCreator實(shí)現(xiàn)了SmartInstantiationAwareBeanPostProcessor接口,是一個(gè)BeanPostProcessor

在某個(gè)Bean實(shí)例化之前,查看該AbstractAutoProxyCreator中是不是設(shè)置了CustomTargetSource,如果設(shè)置了就查看當(dāng)前Bean是不是需要?jiǎng)?chuàng)建一個(gè)TargetSource,如果需要就會(huì)創(chuàng)建一個(gè)TargetSource對(duì)象,然后進(jìn)行AOP創(chuàng)建一個(gè)代理對(duì)象,并返回該代理對(duì)象 如果某個(gè)Bean出現(xiàn)了循環(huán)依賴(lài),那么會(huì)利用getEarlyBeanReference()方法提前進(jìn)行AOP 在某個(gè)Bean初始化之后,會(huì)調(diào)用wrapIfNecessary()方法進(jìn)行AOP 在這個(gè)類(lèi)中提供了一個(gè)抽象方法:getAdvicesAndAdvisorsForBean(),表示對(duì)于某個(gè)Bean匹配了哪些Advices和Advisors

AbstractAdvisorAutoProxyCreator繼承了AbstractAutoProxyCreator,AbstractAdvisorAutoProxyCreator中實(shí)現(xiàn)了getAdvicesAndAdvisorsForBean()方法,實(shí)現(xiàn)邏輯為:

調(diào)用findEligibleAdvisors() 調(diào)用findCandidateAdvisors,得到所有Advisor類(lèi)型的Bean。按當(dāng)前正在進(jìn)行Bean的生命周期的Bean進(jìn)行過(guò)濾 @EnableAspectJAutoProxy

這個(gè)注解主要是添加了一個(gè)AnnotationAwareAspectJAutoProxyCreator類(lèi)型的BeanDefinition。AspectJAwareAdvisorAutoProxyCreator繼承了AbstractAdvisorAutoProxyCreator,重寫(xiě)了shouldSkip(Class<?> beanClass, String beanName)方法,表示某個(gè)bean需不需要進(jìn)行AOP,在shouldSkip()方法中:

拿到所有的Advisor 遍歷所有的Advisor,如果當(dāng)前bean是AspectJPointcutAdvisor,那么則跳過(guò)

AnnotationAwareAspectJAutoProxyCreator繼承了AspectJAwareAdvisorAutoProxyCreator,重寫(xiě)了findCandidateAdvisors()方法,它即可以找到Advisor類(lèi)型的bean,也能把所有@Aspect注解標(biāo)注的類(lèi)掃描出來(lái)并生成Advisor

注解和源碼對(duì)應(yīng)關(guān)系

@Before對(duì)應(yīng)的是AspectJMethodBeforeAdvice,直接實(shí)現(xiàn)MethodBeforeAdvice,在進(jìn)行動(dòng)態(tài)代理時(shí)會(huì)把AspectJMethodBeforeAdvice轉(zhuǎn)成MethodBeforeAdviceInterceptor,也就轉(zhuǎn)變成了MethodBeforeAdviceInterceptor

先執(zhí)行advice對(duì)應(yīng)的方法 再執(zhí)行MethodInvocation的proceed(),會(huì)執(zhí)行下一個(gè)Interceptor,如果沒(méi)有下一個(gè)Interceptor了,會(huì)執(zhí)行target對(duì)應(yīng)的方法

@After對(duì)應(yīng)的是AspectJAfterAdvice,直接實(shí)現(xiàn)了MethodInterceptor

先執(zhí)行MethodInvocation的proceed(),會(huì)執(zhí)行下一個(gè)Interceptor,如果沒(méi)有下一個(gè)Interceptor了,會(huì)執(zhí)行target對(duì)應(yīng)的方法 再執(zhí)行advice對(duì)應(yīng)的方法

@Around對(duì)應(yīng)的是AspectJAroundAdvice,直接實(shí)現(xiàn)了MethodInterceptor

直接執(zhí)行advice對(duì)應(yīng)的方法@AfterThrowing對(duì)應(yīng)的是AspectJAfterThrowingAdvice,直接實(shí)現(xiàn)了MethodInterceptor

先執(zhí)行MethodInvocation的proceed(),會(huì)執(zhí)行下一個(gè)Interceptor,如果沒(méi)有下一個(gè)Interceptor了,會(huì)執(zhí)行target對(duì)應(yīng)的方法 如果上面拋了Throwable,那么則會(huì)執(zhí)行advice對(duì)應(yīng)的方法

@AfterReturning對(duì)應(yīng)的是AspectJAfterReturningAdvice,實(shí)現(xiàn)了AfterReturningAdvice,在進(jìn)行動(dòng)態(tài)代理時(shí)會(huì)把AspectJAfterReturningAdvice轉(zhuǎn)成AfterReturningAdviceInterceptor,也就轉(zhuǎn)變成了MethodInterceptor

先執(zhí)行MethodInvocation的proceed(),會(huì)執(zhí)行下一個(gè)Interceptor,如果沒(méi)有下一個(gè)Interceptor了,會(huì)執(zhí)行target對(duì)應(yīng)的方法 執(zhí)行上面的方法后得到最終的方法的返回值 再執(zhí)行Advice對(duì)應(yīng)的方法

以上就是Spring AOP底層源碼詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring AOP底層源碼的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 激情欧美一区二区三区 | 久久亚洲欧美日韩精品专区 | 精品国产免费一区二区三区五区 | 成人在线免费观看 | 成人国产精品 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 亚洲精品18 | 亚洲欧美日韩电影 | 国产一区久久 | www.国产日本 | 91精品久久久久久久99 | 国产精品欧美精品日韩精品 | 色综合色综合 | 国产精品日日做人人爱 | 亚洲国产精品久久久久婷婷老年 | 欧美一级在线 | 日本视频一区二区三区 | xnxx 日本免费 | 国产精品久久久久久婷婷天堂 | www.亚洲免费 | 精品久久久久久亚洲综合网站 | 户外露出一区二区三区 | 亚洲精品天堂 | 久久国产精品一区二区三区 | 欧美精品第一页 | 亚洲一区二区三区视频 | 国产在线精品一区二区 | 在线观看亚 | 成年视频在线观看福利资源 | 亚洲啊v| 国产激情在线 | 亚洲综合在线一区二区 | 国产精品成人国产乱一区 | 欧美在线观看一区 | 国产精品精品久久久久久 | 午夜视频在线播放 | 三级视频在线观看 | 久久激情五月丁香伊人 | 国产精品不卡 | 精品乱人伦一区二区三区 | 日韩色视频 |