Spring AOP代理詳細(xì)介紹
Spring AOP代理詳細(xì)介紹
前言:
一開(kāi)始我對(duì)spring AOP還是屬于一知半解的狀態(tài),這幾天遇到一個(gè)問(wèn)題,加上又查看了一些Spring相關(guān)知識(shí),感覺(jué)對(duì)這個(gè)問(wèn)題有了更深刻的認(rèn)識(shí)。所以寫(xiě)下來(lái)分享一下。
我們知道,Spring支持多種AOP方式,Spring自己的基于代理的AOP和AspectJ的基于編織(weaving)的AOP。如果一個(gè)類實(shí)現(xiàn)了一個(gè)或多個(gè)接口,那么Spring就會(huì)使用默認(rèn)的JDK動(dòng)態(tài)代理,如果沒(méi)有實(shí)現(xiàn)任何接口,就會(huì)使用cglib來(lái)代理。當(dāng)然我們也可以手動(dòng)改變這些設(shè)置。這也是比較容易掉坑的部分,如果設(shè)置錯(cuò)了代理方式,那么在依賴注入的時(shí)候,就會(huì)出現(xiàn)BeanNotOfRequiredTypeException。
首先來(lái)說(shuō)說(shuō)JDK動(dòng)態(tài)代理,這種代理方式會(huì)代理接口。具體的說(shuō),對(duì)象A實(shí)現(xiàn)了接口A和接口B。Spring會(huì)創(chuàng)建一個(gè)代理對(duì)象,這個(gè)對(duì)象實(shí)現(xiàn)了接口A和接口B,但是需要注意,代理對(duì)象和對(duì)象A沒(méi)有任何關(guān)系。我們可以把代理對(duì)象當(dāng)做任何一個(gè)接口來(lái)使用,但是無(wú)法將代理對(duì)象轉(zhuǎn)換成類A來(lái)使用。
假如我們現(xiàn)在有以下一個(gè)接口和類。
public interface InterfaceA { } public class ClassA implements InterfaceA { }
然后我們使用依賴注入來(lái)獲取對(duì)象A的話就只能類型只能為InterfaceA,如果類型寫(xiě)成ClassA就會(huì)出現(xiàn)BeanNotOfRequiredTypeException。因?yàn)檫@里實(shí)際注入的對(duì)象是一個(gè)實(shí)現(xiàn)了InterfaceA的代理對(duì)象,和ClassA沒(méi)有任何關(guān)系。這種情況是Spring建議我們的,使用接口來(lái)進(jìn)行編程。如果必須注入類的話,就需要使用cglib來(lái)代理,也就是在AOP配置中添加proxy-target-class="true"。
然后再來(lái)說(shuō)說(shuō)cglib代理。這是一個(gè)代理類的方式,所以如果我們使用這種代理,上面的情況下既可以注入ClassA,又可以注入InterfaceA。
最后再來(lái)說(shuō)說(shuō)AspectJ的基于編織的AOP。所謂編織,就是在生成的類文件中增加或修改代碼,有編譯時(shí)編織和運(yùn)行時(shí)編織之分。如果你使用AspectJ并反編譯一個(gè)編織了的類,就會(huì)發(fā)現(xiàn)這個(gè)類文件被AspectJ修改了。由于AspectJ的基于編織的特性,所以基于代理的AOP的自引用、兩種代理的問(wèn)題,在AspectJ中都不會(huì)出現(xiàn)。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
jsp圖片效果大全(圖像震動(dòng)效果、閃爍效果、自動(dòng)切換圖像)
本篇文章主要介紹了jsp圖片效果大全,具有一定的參考價(jià)值,這里整理了詳細(xì)的代碼。有需要的可以直接拿去用。2016-10-10jsp 連接sql server 2008 連接不上的解決方法
需要用到j(luò)sp 通過(guò)jdbc來(lái)訪問(wèn)sql serve2008 , 結(jié)果在遇到好多問(wèn)題,感覺(jué)被坑了個(gè)大。。2013-05-05詳解velocity模板使javaWeb的html+js實(shí)現(xiàn)模塊化
這篇文章主要介紹了詳解velocity模板使javaWeb的html+js實(shí)現(xiàn)模塊化的相關(guān)資料,需要的朋友可以參考下2017-05-05jsp讀取數(shù)據(jù)庫(kù)實(shí)現(xiàn)分頁(yè)技術(shù)簡(jiǎn)析
這篇文章介紹的是用javabean和jsp頁(yè)面來(lái)實(shí)現(xiàn)數(shù)據(jù)的分頁(yè)顯示,例子中所使用的數(shù)據(jù)庫(kù)是Mysql,需要的朋友可以了解下2012-11-11