本文主要介紹spring aop(默認(rèn)使用spring中的aop代理),下面一起看看spring aop(默認(rèn)使用spring中的aop代理)相關(guān)資訊。
spring aop代理的詳細(xì)介紹
前言:
一開始我對(duì)spring aop還是略知一二,但是這幾天遇到了一個(gè)問題,看了一些spring相關(guān)的知識(shí),感覺對(duì)這個(gè)問題有了更深的理解。所以寫下來分享一下。
眾所周知,spring支持各種aop模式,包括spring 自己的基于代理的aop和aspectj 基于編織的aop。如果一個(gè)類實(shí)現(xiàn)了一個(gè)或多個(gè)接口,spring將使用默認(rèn)的jdk動(dòng)態(tài)代理,如果沒有實(shí)現(xiàn)接口,它將使用cglib作為代理。當(dāng)然,我們也可以手動(dòng)更改這些設(shè)置。這也是容易掉坑的部分。如果代理模式設(shè)置不正確,執(zhí)行依賴注入時(shí)將出現(xiàn)beannotofrequiredtypeexception。
首先,讓我們 讓我們談?wù)刯dk動(dòng)態(tài)代理,它將代理接口。具體來說,對(duì)象a實(shí)現(xiàn)了接口a和接口b..spring會(huì)創(chuàng)建一個(gè)代理對(duì)象,它實(shí)現(xiàn)了接口a和接口b,但是需要注意的是,代理對(duì)象與對(duì)象a無關(guān)..我們可以使用代理對(duì)象作為任何接口,但是我們可以 不要將代理對(duì)象轉(zhuǎn)換成a類來使用。
假設(shè)我們現(xiàn)在有了下面的接口和類。
public interface interface a {} public classa實(shí)現(xiàn)接口a { }那么如果我們使用依賴注入來獲取對(duì)象a,那么類型只能是接口a,如果類型寫成class a,就會(huì)出現(xiàn)beannotofrequiredtypeexception。因?yàn)檫@里實(shí)際注入的對(duì)象是實(shí)現(xiàn)interfacea的代理對(duì)象,與classa無關(guān)..這種情況是spring建議的,使用接口進(jìn)行編程。如果必須注入類,就需要使用cglib作為代理,也就是添加proxy-target-class = 真實(shí) 在aop配置中。
那么讓我們 讓我們來談?wù)刢glib代理。這是一個(gè)代理類,所以如果我們使用這個(gè)代理,我們可以在上面的情況中注入classa和interfacea。
最后,讓 讓我們談?wù)刟spectj 基于編織的s aop。所謂編織就是在生成的類文件中添加或修改代碼,分為編譯時(shí)編織和運(yùn)行時(shí)編織。如果你用aspectj反編譯一個(gè)woven類,你會(huì)發(fā)現(xiàn)這個(gè)類文件被aspectj修改了。由于aspectj s基于編織的特點(diǎn),基于agent的aop的自引用和兩個(gè)agent的問題在aspectj中不會(huì)出現(xiàn)。
感謝您的閱讀,希望能幫到您,也感謝您對(duì)本站的支持!
標(biāo)簽:
代理if
了解更多spring aop(默認(rèn)使用spring中的aop代理)相關(guān)內(nèi)容請(qǐng)關(guān)注本站點(diǎn)。