Aspects险耀,切面
spring-aop 是spring-aspects的上層建筑? targetClass MethodInvoker
spring-aspects
從IOC中取得代理以后的對(duì)象蛇数,對(duì)每個(gè)方法進(jìn)行重寫瓶珊,加入一些切面調(diào)用所需要的東西
do開(kāi)頭的方法都是具體干活的方法:doCreateBean?
AOP通知
觸發(fā)器,Trggier? ?專門監(jiān)聽(tīng)的定時(shí)器
AdvisorAdapterRegistrationManager馆里,在bean對(duì)象初始化后注冊(cè)通知適配器,AdvisorAdapterRegistrationManager是BeanPostProcessor的一個(gè)實(shí)現(xiàn)類可柿,其主要作用為容器中管理的Bean注冊(cè)一個(gè)面向切面編程的通知適配器鸠踪,以便在Spring容器為所管理的Bean進(jìn)行面向切面編程時(shí)提供方便
1、Autowiring复斥,實(shí)現(xiàn)原理营密,:SpringIOC容器的依賴自動(dòng)裝配功能,不需要對(duì)Bean屬性的依賴關(guān)系做顯式聲明永票,只需要在配置好autowiring屬性卵贱,IOC容器會(huì)自動(dòng)使用反射查到屬性的類型和名稱,然后給予屬性的類型或者名稱來(lái)自懂匹配容器中管理的Bean侣集,從而自動(dòng)的完成依賴注入
通過(guò)對(duì)autowiring自動(dòng)裝配特性的理解键俱,我們知道容器對(duì)Bean的自動(dòng)裝配發(fā)生在容器對(duì)Bean依賴注入的過(guò)程中,在前面對(duì)Spring IOC容器的依賴注入過(guò)程源碼分析中世分,我們已經(jīng)知道了容器對(duì)Bean實(shí)例對(duì)象的屬性注入的處理發(fā)生在AbstractAutoWireCapableBeanFactory類中的populateBean方法中國(guó)年编振,我們通過(guò)程序流程分析autowiring的實(shí)現(xiàn)原理:
(1)、AbstractAutoWireCapableBeanFactory對(duì)Bean實(shí)例進(jìn)行屬性依賴注入
? ? ? ? 應(yīng)用第一次通過(guò)getBean方法(配置了lazy-init預(yù)實(shí)例化屬性的除外),向IOC容器索取Bean時(shí)踪央,容器創(chuàng)建Bean實(shí)例對(duì)象臀玄,并且對(duì)Bean實(shí)例對(duì)象進(jìn)行屬性依賴注入,AbstractAutoWireCapableBeanFactory的poopulateBean方法就是實(shí)現(xiàn)Bean屬性依賴注入功能畅蹂。
(2)健无、springIOC容器根據(jù)Bean名稱活著類型進(jìn)行autowiring自動(dòng)依賴注入,通過(guò)屬性名進(jìn)行自動(dòng)依賴注入的相對(duì)比通過(guò)屬性類型進(jìn)行自動(dòng)依賴注入要稍微簡(jiǎn)單一些液斜,但是累贤,真正實(shí)現(xiàn)屬性注入的是DefaultSingletonBeanRegistry類的registerDependentBean方法
(3)、DefaultSingletonBeanRegistry類的registerDependentBean方法對(duì)屬性注入
springAOP,如果執(zhí)行規(guī)則呢
一個(gè)切面就代表著N個(gè)Bean的一個(gè)集合少漆,這N個(gè)Bean臼膏,它們都擁有共同點(diǎn),所以它們組成了一個(gè)切面示损,舉例:事物管理的時(shí)候渗磅,就用到了切面的定義,
提問(wèn):
1检访、spring的AOP默認(rèn)使用的是jdk的動(dòng)態(tài)代理還是CGlib始鱼?
IOC判斷,如果被代理的類實(shí)現(xiàn)了一個(gè)接口烛谊,那么默認(rèn)用jdk動(dòng)態(tài)代理风响,如果被代理的對(duì)象沒(méi)有實(shí)現(xiàn)任何接口,那么就默認(rèn)用cglib
1丹禀、加載配置信息状勤,解析成AopConfig
2、交給AopProxyFactory双泪,調(diào)用一個(gè)CreateAopProxy方法持搜;
3、JdkDynamicAopProxy調(diào)用焙矛,advisedSupport的getInterceptorsAndDynamicInterceptionAdvice方法葫盼,得到方法攔截器鏈,并保存到一個(gè)List容器中村斟,MethodInterceptor容器是List
4贫导、遞歸執(zhí)行攔截器方法proceed()方法。
最終就是有一個(gè)ACiesor來(lái)調(diào)用切面中的方法?