SpringAOP是利用代理模式,在運(yùn)行時生成一個目標(biāo)對象的代理,并且使用代理代替目標(biāo)對象,整個過程對使用者透明,使用者無法像使用目標(biāo)對象一樣使用代理對象,代理對象類型是目標(biāo)對象所屬類的子類或者接口實(shí)現(xiàn),北京IT培訓(xùn)認(rèn)為這個子類也是在運(yùn)行時動態(tài)生成,這個生成子類的過程使用操作字節(jié)碼技術(shù),Spring框架中使用兩種字節(jié)碼技術(shù):JDK動態(tài)代理和CGLIB,當(dāng)目標(biāo)類實(shí)現(xiàn)了接口時使用JDK動態(tài)代理,否則使用CGLIB代理。
成都創(chuàng)新互聯(lián)于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元肥東做網(wǎng)站,已為上家服務(wù),為肥東各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792
AOP的實(shí)現(xiàn)包含下面幾個步驟:根據(jù)配置或注解解析切面。
生成AOP代理對象,給目標(biāo)對象生成一個代理類以及代理類實(shí)例,根據(jù)解析出的切面,生成通知鏈設(shè)置到代理對象,在代理的回調(diào)中會執(zhí)行通知鏈。
把AOP代理對象注冊到容器中代替目標(biāo)對象,當(dāng)使用者向容器請求目標(biāo)bean時,容器會返回代理對象。
下面對這幾個步驟逐一的分析。
切面解析在分析切面解析過程之前,首先先了解一下幾個關(guān)鍵的接口,看下面的類圖。
PointCut:描述切點(diǎn),在進(jìn)行切點(diǎn)匹配時,使用ClassFilter進(jìn)行類匹配,MethodMatcher進(jìn)行執(zhí)行方法匹配。
Advice:通知,AfterAdvice后通知,BeforeAdvice前通知,DynamicIntroductionAdvice引用通知,環(huán)繞通知通過Interceptor實(shí)現(xiàn)。
Advisor:通知器,也就是切面,PointcutAdvisor切點(diǎn)通知器,IntroductionAdvisor引用通知器。
在創(chuàng)建AOP代理之前需要把相關(guān)的切面配置解析成上面類圖中的接口子類的對象,對于ProxyFactoryBean來說,沒有這個過程,因?yàn)檫@種方式下不能使用切點(diǎn)。
切面解析完成之后,把解析出的通知添加通知鏈中,AOP代理對象引用該通知鏈執(zhí)行切面通知邏輯。
對于aop標(biāo)簽方式和注解方式添加通知鏈這個動作的代碼是類似的,解析切面這個過程有些差異。
首先你可以使用輸入輸出流(或者你說的可能是要用反射得到程序結(jié)果來解析)解析做出*.Java文件。
然后可以使用runtime調(diào)用Dos下的java編譯命令編譯取得class文件。
然后使用classloader,反射等組合執(zhí)行生成的class文件。
可以的,我說說大概思路,很簡單,你自己具體實(shí)現(xiàn)吧,把代碼寫給你沒意義的:
1.將你這段字符串輸出到一個文件里,用Java類文件的方式命名。
2.調(diào)用外部javac命令將該文件編譯。
3.用類加載器(ClassLoad)動態(tài)加載新的class文件并用Class.forName()注冊該類,然后就可以正常使用了。
上面的每一步都能在baidu中找到實(shí)現(xiàn)方法,自己發(fā)揮吧。