通過配置織入@Aspectj切面
雖然可以通過編程的方式織入切面,但是一般情況下,我們還是使用spring的配置自動(dòng)完成創(chuàng)建代理織入切面的工作。
通過aop命名空間的<aop:aspectj-autoproxy />聲明自動(dòng)為spring容器中那些配置@aspectJ切面的bean創(chuàng)建代理,織入切面。當(dāng)然,spring
在內(nèi)部依舊采用AnnotationAwareAspectJAutoProxyCreator進(jìn)行自動(dòng)代理的創(chuàng)建工作,但具體實(shí)現(xiàn)的細(xì)節(jié)已經(jīng)被<aop:aspectj-autoproxy />隱藏起來了
<aop:aspectj-autoproxy />有一個(gè)proxy-target-class屬性,默認(rèn)為false,表示使用jdk動(dòng)態(tài)代理織入增強(qiáng),當(dāng)配為<aop:aspectj-autoproxy poxy-target-class="true"/>時(shí),表示使用CGLib動(dòng)態(tài)代理技術(shù)織入增強(qiáng)。不過即使proxy-target-class設(shè)置為false,如果目標(biāo)類沒有聲明接口,則spring將自動(dòng)使用CGLib動(dòng)態(tài)代理。
@AspectJ語(yǔ)法基礎(chǔ)
@AspectJ使用jdk5.0注解和正規(guī)則的AspectJ 5的切面表達(dá)式語(yǔ)言描述切面,由于spring只支持方法的連接點(diǎn),所以spring僅支持部分aspectJ的切面語(yǔ)言,在這節(jié)時(shí),我們將對(duì)AspectJ切點(diǎn)表達(dá)式語(yǔ)言進(jìn)行必要的學(xué)習(xí)。
切點(diǎn)表達(dá)式函數(shù)
AspectJ 5的切點(diǎn)表達(dá)式由關(guān)鍵字和操作參數(shù)組成。如execution(*greeTo(..))的切點(diǎn)表達(dá)式,"execute"為關(guān)鍵字,而"*greeTo(..)"為操作參數(shù)。在這里,execution代表目標(biāo)類執(zhí)行某一方法,而"*greeTo(..)"是描述目標(biāo)方法的匹配模式串,兩者聯(lián)合起來所表示的切點(diǎn)匹配目標(biāo)類greeTo(..)方法的連接點(diǎn)。為了描述方便,我們將execution()稱作函數(shù),而將匹配串"*greeTo(..)"稱作函數(shù)的入?yún)ⅰ?/P>