前面的文章中對(duì)SpringAOP進(jìn)行了簡(jiǎn)單的實(shí)踐,本章將說明在實(shí)際的開發(fā)中如何對(duì)切面進(jìn)行配置使用.
創(chuàng)新互聯(lián)建站是一家專業(yè)提供仙居企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、HTML5、小程序制作等業(yè)務(wù)。10年已為仙居眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。
1,直接使用Advice來作用到目標(biāo)類的所有方法上
<!--配置Advice-->
<bean id="customAdvice" class=""/>
<!--目標(biāo)對(duì)象-->
<bean id="target" class=""/>
<!--配置代理工廠-->
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean"
p:proxyInterfaces="com.xx.MyInterface" <!--指定代理的接口-->
p:interceptorNames="customAdvice" <!--指定增強(qiáng)-->
p:target-ref="target"/> <!--指定要代理的bean-->
proxyInterfaces(interfaces):代理索要實(shí)現(xiàn)的接口,多個(gè)可用逗號(hào)分隔;
interceptorNames:目標(biāo)對(duì)象列表,多個(gè)可用逗號(hào)分隔;
singleton:返回的代理是否為單例,默認(rèn)是;
optimize屬性設(shè)置為true,強(qiáng)制使用CGLib動(dòng)態(tài)代理。
還可以使用屬性proxyTargetClass指明是否是對(duì)類進(jìn)行代理而不是接口, 當(dāng)設(shè)置為true時(shí),使用CGlib動(dòng)態(tài)代理并且無需再設(shè)置proxyInterfaces屬性,即便設(shè)置也會(huì)被忽略;
除了上面說到的使用逗號(hào)來分隔多個(gè)增強(qiáng)外,還可以像下面這樣使用
<property name="interceptorNames">
<list>
<idref local="advice1" />
<idref local="advice2" />
</list>
</property>
2,通過自定義切面來應(yīng)用增強(qiáng)
<bean id="customAdvice" class=""/>
<bean id="customAdvisor" class="com.custom.xx"
p:advice-ref="customAdvice"/> <!--定義切面-->
<bean id="base" abstract="true" <!--定義公共配置類-->
class="org.springframework.aop.framework.ProxyFactoryBean"
p:interceptorNames="customAdvisor" />
<bean id="proxy1" parent="base" p:target-ref="" />
<bean id="proxy2" parent="base" p:target-ref="" />
3,通過正則切面來應(yīng)用增強(qiáng)
<bean id="regexAdvisor"
class="org.springframework.aop.support.RegexpMethonPointcutAdvisor"
p:advice-ref="customAdvice"
<property name="patterns">
<list>
<value>.*insert*</value>
</list>
</property>
</bean>
<bean id="proxy"
class="org.springframework.aop.framework.ProxyFactoryBean"
p:interceptorNames="regexAdvisor"
p:target-ref=""
p:proxyTargetClass="true"/>
上面的配置都需要顯示的配置代理對(duì)象,對(duì)于小型的應(yīng)用或不嫌麻煩的話還是可以接受的,大如果面對(duì)中大型的系統(tǒng)來講,通過上面的配置來達(dá)到目的既容易出錯(cuò),更是十分的麻煩,所以Spring提供了自動(dòng)代理機(jī)制,從而讓開發(fā)人員從煩亂的配置中解脫出來。
自動(dòng)代理機(jī)制是基于BeanPostProcessor實(shí)現(xiàn),自動(dòng)代創(chuàng)建器根據(jù) 一些規(guī)則來自動(dòng)在容器中實(shí)例化Bean時(shí)為匹配的Bean生成代理實(shí)例。其代理創(chuàng)建器主要分為3類
1,基于Bean配置名規(guī)則的自動(dòng)代理創(chuàng)建器:允許為一組特定配置名的Bean自動(dòng)創(chuàng)建代理實(shí)例,實(shí)現(xiàn)類為BeanNameAutoProxyCreator
2,基于Advisor匹配機(jī)制的自動(dòng)代理創(chuàng)建器:它對(duì)容器中所有的Advisor進(jìn)行掃描,自動(dòng)將這些切面應(yīng)用到匹配的Bean中(為目標(biāo)Bean創(chuàng)建代理實(shí)例),實(shí)現(xiàn)類為DefaultAdvisorAutoProxyCreator.
3,基于Bean中AspectJ注解的自動(dòng)代理創(chuàng)建器:為包含AspectJ注解的Bean自動(dòng)創(chuàng)建代理實(shí)例,實(shí)現(xiàn)類為AnnotationAwareAspectJAutoProxyCreator.
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProyCreator"
p:beanNames="*er"
p:interceptorNames=""
p:optimize="true" />
<bean id="regexAdrisor" class="" />
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />
1)XML配置來啟用AnnotationAwareAspectJAutoProxyCreator
<!--使用@AspectJ注解定義的切面類-->
<bean id="aspectJAnnotationBean" class="" />
<!--自動(dòng)代理創(chuàng)建器,自動(dòng)將@AspectJ注解切面類織入目標(biāo)bean中-->
<bean class="org.springframework.aop.framework.autoproxy.AnnotationAwareAspectJAutoProxyCreator" />
2)使用Schema的aop命名空間進(jìn)行配置
<!--基于@AspectJ切面的驅(qū)動(dòng)器-->
<aop:aspectj-autoproxy/>
<!--使用@AspectJ注解定義的切面類-->
<bean class="com.xx.customAspectJAdvisor" />
3)還可以使用注解的方式來裝配
<!-- 使用注解來裝配(等同schema方式)-->
@EnableAspectJAutoProxy(exposeProxy=true)
<!--使用@AspectJ注解定義的切面類-->
<bean id="aspectJAnnotationBean" class="" />
切面類舉例:
@Aspect
@Component
public class CustomAspect {
/*
執(zhí)行g(shù)etName方法后執(zhí)行
*/
@AfterReturning(returning = "result", pointcut = "execution(* com.xx.getName())")
public void singeLoginAfter(String result) throws Exception {
//TODO
}
/*
使用注解CustomAnnoation的方法執(zhí)行后
*/
@AfterReturning("@annotation(com.xx.annotation.CustomAnnoation)")
public void refreshLinkGroupCache(JoinPoint joinPoint) {
}
}
1,如果增強(qiáng)在同一個(gè)切面類中申明,則依照增強(qiáng)在連接點(diǎn)上的織入順序進(jìn)行織入
2,如果增強(qiáng)位于不同的切面類中,且這些切面類都實(shí)現(xiàn)了org.springframework.core.Ordered接口,則有切口方法的順序號(hào)決定(順序號(hào)小的先織入)
3,如果增強(qiáng)位于不同的切面類中,且這些切面類沒有實(shí)現(xiàn)了org.springframework.core.Ordered接口,則織入的順序不確定
名稱欄目:SpringAOP之切面的配置
分享網(wǎng)址:http://muchs.cn/article26/picsjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、品牌網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)、商城網(wǎng)站、Google、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)