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

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

Spring AOP底層源碼詳解

瀏覽:20日期: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久久,三上悠亚国产精品一区二区三区
亚洲综合不卡| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 亚洲尤物在线| 日韩成人亚洲| 激情六月综合| 野花国产精品入口| 日韩中文字幕亚洲一区二区va在线| 免费观看在线色综合| 日本一区二区三区中文字幕| 日韩高清不卡在线| 日本午夜精品视频在线观看| 国产精品网在线观看| 九九九精品视频| 亚洲深夜视频| 日韩久久视频| 99香蕉国产精品偷在线观看 | 91精品国产自产观看在线| 久久国产精品免费精品3p| 国产精品一级在线观看| sm久久捆绑调教精品一区| 香蕉人人精品| 久久电影一区| 国产人成精品一区二区三| 国产精品日韩精品中文字幕| 精品国产乱码| 在线一区电影| 日本不卡视频在线| 精品伊人久久久| 亚洲一级影院| 亚洲人妖在线| 欧美激情视频一区二区三区免费| 日本黄色精品| 欧美日韩国产欧| 欧美在线看片| 日韩不卡在线| 伊人久久亚洲| 精品免费av| 亚洲色诱最新| 国产精品三p一区二区| 高清不卡亚洲| 天使萌一区二区三区免费观看| 91免费精品国偷自产在线在线| 成人在线视频免费| 日韩视频一区二区三区在线播放免费观看| 亚洲毛片在线免费| 美女久久久精品| 国产综合激情| 奇米狠狠一区二区三区| 色综合狠狠操| 亚洲一区二区三区免费在线观看| 国产日韩欧美一区| 久久九九电影| 久久精品99国产精品日本| 免费在线小视频| 丝袜国产日韩另类美女| 国模大尺度视频一区二区| 免费在线视频一区| 国产精品99一区二区三| 首页国产欧美日韩丝袜| 久久中文字幕导航| 久久亚洲电影| 亚洲涩涩在线| 国产精品天天看天天狠| 性色一区二区| 午夜av成人| 美女视频免费精品| 在线看片日韩| 久久九九电影| 国产精品分类| 在线看片不卡| 国产suv精品一区| 亚洲人成毛片在线播放女女| 成人午夜网址| 日韩国产在线观看| 久久高清精品| 精品一区二区三区中文字幕视频| 亚洲毛片在线免费| 九色精品91| 黄色在线网站噜噜噜| 欧美在线看片| 蜜桃免费网站一区二区三区| av高清不卡| 国产精品对白久久久久粗| 蜜桃一区二区三区在线观看 | 精品国产精品国产偷麻豆| 日韩欧美美女在线观看| 欧美成人日韩| 丝袜诱惑一区二区| 免费看久久久| 日韩成人午夜精品| 亚洲一区日本| 欧美日韩一区二区三区视频播放| 麻豆精品少妇| 欧美午夜网站| 日韩国产在线不卡视频| 亚洲一区导航| 中文亚洲免费| 久久免费大视频| 欧美国产一级| 国产成人精品福利| 免费看一区二区三区| 青青草视频一区| 亚洲三级网址| 日韩精品一二三| 99在线精品免费视频九九视| 欧美在线观看视频一区| 日韩一区二区三区免费播放| 精品久久久久久久| 麻豆精品视频在线| 久久爱www成人| 国产精品巨作av| 欧美日韩a区| 欧美视频二区| 视频精品一区| 四虎国产精品免费久久| 婷婷精品在线观看| 视频精品一区| 青草av.久久免费一区| 日本国产亚洲| 国产伦精品一区二区三区在线播放| 日韩专区视频网站| 天堂va欧美ⅴa亚洲va一国产| 在线免费观看亚洲| 天堂精品久久久久| 欧美一区免费| 国产精品调教| 精品美女久久| 中文一区一区三区高中清不卡免费| 国产乱码精品一区二区三区亚洲人 | 久久婷婷亚洲| 五月天久久久| 午夜在线视频一区二区区别| 日本 国产 欧美色综合| 午夜精品福利影院| 国产剧情在线观看一区| 国产福利一区二区三区在线播放| 欧美激情 亚洲a∨综合| 成人在线免费观看网站| 日本久久成人网| 午夜久久影院| 亚洲一级黄色| 久久最新视频| 国产乱子精品一区二区在线观看 | 美女av在线免费看| 欧美成人综合| 视频国产精品| 国产精品777777在线播放| 高清在线一区| 精品一区在线| 日韩精品视频在线看| 免费在线观看一区| 四虎4545www国产精品 | 国产欧美精品| 国产v日韩v欧美v| 午夜国产一区二区| 美国三级日本三级久久99| 久久国产精品免费精品3p| 高潮久久久久久久久久久久久久| 久久免费国产| 亚洲精一区二区三区| 欧美黑人做爰爽爽爽| 久久久噜噜噜| 亚洲另类av| 久久精品国产999大香线蕉| 欧美中文一区二区| 色8久久久久| 亚洲黄色免费av| 亚洲最大av| 麻豆精品在线| 亚洲免费成人| 欧美国产中文高清| 在线日韩欧美| 日精品一区二区三区| 中文字幕成在线观看| 免费观看在线色综合| 精品欧美日韩精品| 欧美资源在线| 国产一区精品福利| 91高清一区| 国产精品色在线网站| 欧美日韩国产高清电影| 国产精品一区二区中文字幕| 久久麻豆精品| 国产精品久久久久久久久免费高清 | 亚洲欧美日韩国产一区二区| 天堂俺去俺来也www久久婷婷| 精品久久97| 天使萌一区二区三区免费观看| 久久精品欧洲| 视频一区视频二区中文| 鲁大师精品99久久久| 妖精视频成人观看www| 精品伊人久久久| 午夜在线视频观看日韩17c| 国产一区二区三区天码| 在线视频亚洲欧美中文| 91精品国产成人观看| 国产精品久久久久久久久久妞妞 | 日韩午夜一区| 精品国产美女a久久9999|