SpringAOP之切面的配置

前面的文章中對(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)行中。

一、Spring中顯示的配置ProxyFactory

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"/>  

二、Spring的自動(dòng)代理機(jī)制

上面的配置都需要顯示的配置代理對(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.
Spring AOP之切面的配置

BeanNameAutoProxyCreator
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProyCreator" 
    p:beanNames="*er"  
    p:interceptorNames="" 
    p:optimize="true" />
DefaultAdvisorAutoProxyCreator
<bean id="regexAdrisor" class="" />
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"  />
AnnotationAwareAspectJAutoProxyCreator

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) {

    }
}
多個(gè)增強(qiáng)(Advice)的織入順序

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)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)