日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Spring AOP底層源碼詳解

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

ProxyFactory是一個代理對象生產工廠,在生成代理對象之前需要對代理工廠進行配置。ProxyFactory在生成代理對象之前需要決定到底是使用JDK動態代理還是CGLIB技術。

// config就是ProxyFactory對象// optimize為true,或proxyTargetClass為true,或用戶沒有給ProxyFactory對象添加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動態代理 if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy(config); } // 使用Cglib return new ObjenesisCglibAopProxy(config);}else { // 使用Jdk動態代理 return new JdkDynamicAopProxy(config);}JdkDynamicAopProxy創建代理對象過程 獲取生成代理對象所需要實現的接口集合 獲取通過ProxyFactory.addInterface()所添加的接口,如果沒有通過ProxyFactory.addInterface()添加接口,那么則看ProxyFactory。setTargetClass()所設置的targetClass是不是一個接口,把接口添加到結果集合中,同時把SpringProxy、Advised、DecoratingProxy這幾個接口也添加到結果集合中去。 確定好要代理的集合之后,就利用Proxy.newProxyInstance()生成一個代理對象。 JdkDynamicAopProxy創建代理對象執行過程 如果通過ProxyFactory.setExposeProxy()把exposeProxy設置為true,那么則把代理對象設置到一個ThreadLocal(currentProxy)中去。 獲取通過ProxyFactory所設置的target,如果設置的是targetClass,那么target將為null 根據當前所調用的方法對象尋找ProxyFactory中所添加的并匹配的Advisor,并且把Advisor封裝為MethodInterceptor返回,得到MethodIntercepter鏈叫做chain 如果chain為空,則字節執行target對應的當前方法,如果target為null會報錯 如果chain不為空,則會依次執行chain中的MethodInterceptor。如果當前MethodInterceptor是MethodBeforeAdviceInterceptor,那么先執行Advisor中所advice的before()方法,然后執行下一個MethodInterceptor.如果當前MethodInterceptor是AfterReturningAdviceInterceptor,那么先執行執行下一個MethodInterceptor。拿到返回值后,再執行Advisor中所advice的afterReturning()方法 ObjenesisCglibAopProxy創建代理對象過程 創建Enhancer 設置Enhancer的superClass為通過ProxyFactory.setTarget()所設置的對象的類 設置Enhancer的interfaces為通過ProxyFactory.addInterface()所添加的接口,以及SpringProxy、Advisor接口 設置Enhancer的Callbacks為DynamicAdvisedIntercepter 最后通過Enhancer創建一個代理對象 ObjenesisCglibAopProxy創建的代理對象執行過程

執行過程主要就看DynamicAdvisedInterceptor中的實現,執行邏輯和JdkDynamicAopProxy中是一樣的。

自動代理(autoproxy)功能

“自動代理”表示只需要在Spring中添加某個Bean,這個Bean是一個BeanPostProcessor,那么Spring在每創建一個Bean時,都會經過這個BeanPost Processor的判斷,去判斷當前正在創建的這個Bean是不是需要進行AOP。

DefaultAdvisorAutoProxyCreator

AbstractAutoProxyCreator實現了SmartInstantiationAwareBeanPostProcessor接口,是一個BeanPostProcessor

在某個Bean實例化之前,查看該AbstractAutoProxyCreator中是不是設置了CustomTargetSource,如果設置了就查看當前Bean是不是需要創建一個TargetSource,如果需要就會創建一個TargetSource對象,然后進行AOP創建一個代理對象,并返回該代理對象 如果某個Bean出現了循環依賴,那么會利用getEarlyBeanReference()方法提前進行AOP 在某個Bean初始化之后,會調用wrapIfNecessary()方法進行AOP 在這個類中提供了一個抽象方法:getAdvicesAndAdvisorsForBean(),表示對于某個Bean匹配了哪些Advices和Advisors

AbstractAdvisorAutoProxyCreator繼承了AbstractAutoProxyCreator,AbstractAdvisorAutoProxyCreator中實現了getAdvicesAndAdvisorsForBean()方法,實現邏輯為:

調用findEligibleAdvisors() 調用findCandidateAdvisors,得到所有Advisor類型的Bean。按當前正在進行Bean的生命周期的Bean進行過濾 @EnableAspectJAutoProxy

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

拿到所有的Advisor 遍歷所有的Advisor,如果當前bean是AspectJPointcutAdvisor,那么則跳過

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

注解和源碼對應關系

@Before對應的是AspectJMethodBeforeAdvice,直接實現MethodBeforeAdvice,在進行動態代理時會把AspectJMethodBeforeAdvice轉成MethodBeforeAdviceInterceptor,也就轉變成了MethodBeforeAdviceInterceptor

先執行advice對應的方法 再執行MethodInvocation的proceed(),會執行下一個Interceptor,如果沒有下一個Interceptor了,會執行target對應的方法

@After對應的是AspectJAfterAdvice,直接實現了MethodInterceptor

先執行MethodInvocation的proceed(),會執行下一個Interceptor,如果沒有下一個Interceptor了,會執行target對應的方法 再執行advice對應的方法

@Around對應的是AspectJAroundAdvice,直接實現了MethodInterceptor

直接執行advice對應的方法@AfterThrowing對應的是AspectJAfterThrowingAdvice,直接實現了MethodInterceptor

先執行MethodInvocation的proceed(),會執行下一個Interceptor,如果沒有下一個Interceptor了,會執行target對應的方法 如果上面拋了Throwable,那么則會執行advice對應的方法

@AfterReturning對應的是AspectJAfterReturningAdvice,實現了AfterReturningAdvice,在進行動態代理時會把AspectJAfterReturningAdvice轉成AfterReturningAdviceInterceptor,也就轉變成了MethodInterceptor

先執行MethodInvocation的proceed(),會執行下一個Interceptor,如果沒有下一個Interceptor了,會執行target對應的方法 執行上面的方法后得到最終的方法的返回值 再執行Advice對應的方法

以上就是Spring AOP底層源碼詳解的詳細內容,更多關于Spring AOP底層源碼的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲国产日韩欧美在线| 日韩精品社区| 麻豆视频久久| 精品久久美女| 久久超级碰碰| 日韩精品dvd| 国产字幕视频一区二区| 天堂va蜜桃一区二区三区| 亚洲精品极品| 国产精品xxx| 91精品国产91久久久久久黑人| 欧美日韩四区| 久久狠狠久久| av高清一区| 午夜在线视频观看日韩17c| 在线看片日韩| 欧美激情亚洲| 亚洲香蕉网站| 亚洲综合激情在线| 国产精品啊啊啊| 秋霞国产精品| 视频精品一区| 日韩精品2区| 日韩精选在线| 99久久激情| 国产精品久一| 亚洲精品一区二区妖精| 国产精品入口久久| 三上悠亚国产精品一区二区三区| 亚洲视频二区| 97精品一区二区| 日韩欧美中文字幕电影| 日韩免费av| 国产日韩欧美三级| 在线国产一区| 国产伦理久久久久久妇女| 亚洲天堂久久| 精品久久福利| 亚洲精品高潮| 精品在线99| 久久精品国产一区二区| 日本欧美在线看| av在线最新| 国产精品极品在线观看| 石原莉奈在线亚洲二区| 久久精品青草| 精品免费视频| 久久国产欧美日韩精品| 国产视频一区三区| av日韩中文| 亚洲va久久| 午夜国产一区二区| 久久香蕉网站| 91亚洲精品在看在线观看高清| 欧美~级网站不卡| 成人污污视频| 国产毛片精品| 亚洲bt欧美bt精品777| 黄色亚洲免费| 久久久夜精品| 中文字幕一区久| 国产精品v一区二区三区| 热久久国产精品| 欧美日韩四区| 91精品啪在线观看国产18| 国产精品中文| 日本在线观看不卡视频| 蜜桃成人av| 极品av在线| 精品久久不卡| 欧美精品不卡| 国产乱子精品一区二区在线观看| 一区二区高清| 香蕉久久久久久久av网站| 蜜臀av免费一区二区三区| 日韩国产欧美| аⅴ资源天堂资源库在线| 久久精品福利| 精品一区视频| 久久一区精品| 国产精品调教视频| 久久国产乱子精品免费女| 日韩欧美2区| 免播放器亚洲一区| 日韩影院免费视频| 亚洲三级网站| 97久久精品| 国产伦乱精品| 久久久久久久欧美精品| 国产亚洲字幕| 国产欧美日韩一级| 日韩区一区二| 日本视频中文字幕一区二区三区| 中文字幕日韩亚洲| 午夜精品影视国产一区在线麻豆| 亚洲日产国产精品| 国产亚洲一区二区三区啪| 日本一不卡视频| 国产日韩一区二区三区在线播放| 国产探花一区| 国产一区二区三区视频在线| av中文资源在线资源免费观看| 精品三级在线| 免费污视频在线一区| re久久精品视频| 久久av一区| 日韩av中文字幕一区二区三区| 国产精选久久| 最新中文字幕在线播放 | 精品三区视频| 精精国产xxxx视频在线播放| 免费观看不卡av| 亚洲一二av| 毛片不卡一区二区| 午夜av成人| 日韩精品一卡二卡三卡四卡无卡| 日韩免费精品| 国产一区二区三区四区五区传媒| 久久婷婷av| 蜜臀av一区二区在线免费观看 | 亚洲精品在线a| 嫩草伊人久久精品少妇av杨幂| 国产精品久久久久久久久久10秀 | 国产精品密蕾丝视频下载| 在线看片福利| 丝袜美腿亚洲色图| 国产精品入口久久| 亚洲特级毛片| 欧美日一区二区在线观看| 国产激情在线播放| 亚洲男女av一区二区| 欧美日韩视频免费看| 中文在线а√天堂| 免费不卡在线视频| 麻豆国产精品| 国产极品久久久久久久久波多结野 | 日韩激情中文字幕| 婷婷成人av| 捆绑调教日本一区二区三区| 免费日本视频一区| 国产一区2区| 免费成人在线视频观看| 色婷婷色综合| 一二三区精品| 亚洲精品**中文毛片| 久久av一区二区三区| 国产精品任我爽爆在线播放| 欧美a级一区| 国产精品久久久久9999高清| 欧美91精品| 老司机精品视频网| 欧美特黄一区| 精品三级在线| 亚洲精品动态| 日韩在线看片| 奇米狠狠一区二区三区| 91九色精品国产一区二区| 国产精成人品2018| 喷白浆一区二区| 亚洲综合在线电影| 91精品视频一区二区| 久久久成人网| 美女精品视频在线| 天堂俺去俺来也www久久婷婷| 日韩国产欧美一区二区三区| 欧美+日本+国产+在线a∨观看| 国产剧情在线观看一区| 欧美在线综合| 91超碰国产精品| 日韩毛片视频| 精品少妇av| 国产麻豆精品| 色狠狠一区二区三区| 五月婷婷六月综合| 三级小说欧洲区亚洲区| 国产精品magnet| 日韩专区欧美专区| 国产综合精品一区| 成人国产精品| 国产精品毛片视频| 国产午夜一区| 日韩精品亚洲专区| 免费在线看一区| 99日韩精品| 天堂资源在线亚洲| 欧美日韩视频免费观看| 日产午夜精品一线二线三线| 国产精品成人自拍| 国产日韩免费| 久久国产人妖系列| 日韩av黄色在线| 一区二区高清| 影音先锋久久精品| 久久成人精品| 亚洲精品一区二区妖精| 欧美色图国产精品| 久久免费黄色| 欧美va天堂在线| 亚洲激情久久| 日韩视频一区|