亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring AOP之切面的配置

發布時間:2020-07-25 17:01:45 來源:網絡 閱讀:1189 作者:mybabe0312 欄目:編程語言

前面的文章中對SpringAOP進行了簡單的實踐,本章將說明在實際的開發中如何對切面進行配置使用.

一、Spring中顯示的配置ProxyFactory

1,直接使用Advice來作用到目標類的所有方法上

<!--配置Advice-->
<bean id="customAdvice" class=""/>
<!--目標對象-->
<bean id="target" class=""/>
<!--配置代理工廠-->
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean"
    p:proxyInterfaces="com.xx.MyInterface" <!--指定代理的接口-->
    p:interceptorNames="customAdvice" <!--指定增強-->
    p:target-ref="target"/>  <!--指定要代理的bean-->

proxyInterfaces(interfaces):代理索要實現的接口,多個可用逗號分隔;
interceptorNames:目標對象列表,多個可用逗號分隔;
singleton:返回的代理是否為單例,默認是;
optimize屬性設置為true,強制使用CGLib動態代理。
還可以使用屬性proxyTargetClass指明是否是對類進行代理而不是接口, 當設置為true時,使用CGlib動態代理并且無需再設置proxyInterfaces屬性,即便設置也會被忽略;

除了上面說到的使用逗號來分隔多個增強外,還可以像下面這樣使用

<property name="interceptorNames">
    <list>
        <idref local="advice1" />
        <idref local="advice2" />
    </list>
</property>

2,通過自定義切面來應用增強

<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,通過正則切面來應用增強

<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的自動代理機制

上面的配置都需要顯示的配置代理對象,對于小型的應用或不嫌麻煩的話還是可以接受的,大如果面對中大型的系統來講,通過上面的配置來達到目的既容易出錯,更是十分的麻煩,所以Spring提供了自動代理機制,從而讓開發人員從煩亂的配置中解脫出來。

自動代理機制是基于BeanPostProcessor實現,自動代創建器根據 一些規則來自動在容器中實例化Bean時為匹配的Bean生成代理實例。其代理創建器主要分為3類
1,基于Bean配置名規則的自動代理創建器:允許為一組特定配置名的Bean自動創建代理實例,實現類為BeanNameAutoProxyCreator
2,基于Advisor匹配機制的自動代理創建器:它對容器中所有的Advisor進行掃描,自動將這些切面應用到匹配的Bean中(為目標Bean創建代理實例),實現類為DefaultAdvisorAutoProxyCreator.
3,基于Bean中AspectJ注解的自動代理創建器:為包含AspectJ注解的Bean自動創建代理實例,實現類為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="" />
<!--自動代理創建器,自動將@AspectJ注解切面類織入目標bean中-->
<bean class="org.springframework.aop.framework.autoproxy.AnnotationAwareAspectJAutoProxyCreator"  />

2)使用Schema的aop命名空間進行配置

<!--基于@AspectJ切面的驅動器-->
<aop:aspectj-autoproxy/>

<!--使用@AspectJ注解定義的切面類-->
<bean class="com.xx.customAspectJAdvisor" />

3)還可以使用注解的方式來裝配

<!-- 使用注解來裝配(等同schema方式)-->
@EnableAspectJAutoProxy(exposeProxy=true)

<!--使用@AspectJ注解定義的切面類-->
<bean id="aspectJAnnotationBean" class="" />

切面類舉例:

@Aspect
@Component
public class CustomAspect {
    /*
        執行getName方法后執行
    */
    @AfterReturning(returning = "result", pointcut = "execution(* com.xx.getName())")
    public void singeLoginAfter(String result) throws Exception {
        //TODO
    }

    /*
        使用注解CustomAnnoation的方法執行后
    */
    @AfterReturning("@annotation(com.xx.annotation.CustomAnnoation)")
    public void refreshLinkGroupCache(JoinPoint joinPoint) {

    }
}
多個增強(Advice)的織入順序

1,如果增強在同一個切面類中申明,則依照增強在連接點上的織入順序進行織入
2,如果增強位于不同的切面類中,且這些切面類都實現了org.springframework.core.Ordered接口,則有切口方法的順序號決定(順序號小的先織入)
3,如果增強位于不同的切面類中,且這些切面類沒有實現了org.springframework.core.Ordered接口,則織入的順序不確定

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

河源市| 达尔| 抚松县| 合山市| 监利县| 桓台县| 长乐市| 克什克腾旗| 太保市| 赣州市| 武清区| 湄潭县| 宜丰县| 卓资县| 红安县| 吉木萨尔县| 宜宾县| 广平县| 都昌县| 柳江县| 温宿县| 云林县| 平遥县| 奈曼旗| 通州市| 平阳县| 祁门县| 岚皋县| 乐业县| 沂南县| 崇礼县| 富平县| 仁化县| 营口市| 河东区| 堆龙德庆县| 泾阳县| 吉安县| 丘北县| 霍邱县| 宾阳县|