欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于<aop:aspect>與<aop:advisor>的區(qū)別

 更新時(shí)間:2021年11月24日 08:36:12   作者:愛上香鍋的麻辣  
這篇文章主要介紹了<aop:aspect>與<aop:advisor>的區(qū)別,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

在開發(fā)過程中,不少有Spring Aop的使用,在面向切面編程時(shí),我們會(huì)使用< aop:aspect>;在進(jìn)行事務(wù)管理時(shí),我們會(huì)使用< aop:advisor>。那么,對于< aop:aspect>與< aop:advisor>的區(qū)別,具體是怎樣的呢?

至于兩者的區(qū)別,網(wǎng)上有很多資料,但是似乎都不能說清楚。

首先,我們需要明確兩者的概念。

  • < aop:aspect>:定義切面(切面包括通知和切點(diǎn))
  • < aop:advisor>:定義通知器(通知器跟切面一樣,也包括通知和切點(diǎn))

下面,我們列舉兩者的幾個(gè)區(qū)別。

1、實(shí)現(xiàn)方式不同

< aop:aspect>定義切面時(shí),只需要定義一般的bean就行,而定義< aop:advisor>中引用的通知時(shí),通知必須實(shí)現(xiàn)Advice接口。

下面我們舉例說明。

首先,我們定義一個(gè)接口Sleepable和這個(gè)接口的實(shí)現(xiàn)Human,代碼如下:

public interface Sleepable {
    public void sleep();
}
public class Human implements Sleepable {
    @Override
    public void sleep() {
        System.out.println("我要睡覺了!");
    }
}

下面是< aop:advisor>的實(shí)現(xiàn)方式:

//定義通知
public class SleepHelper implements MethodBeforeAdvice,AfterReturningAdvice{
    @Override
    public void before(Method arg0, Object[] arg1, Object arg2)
            throws Throwable {
        System.out.println("睡覺前要脫衣服!");
    }
    @Override
    public void afterReturning(Object arg0, Method arg1, Object[] arg2,
            Object arg3) throws Throwable {
        System.out.println("起床后要穿衣服!");
    }
}
//aop配置
<bean id="sleepHelper" class="com.ghs.aop.SleepHelper"></bean>
<aop:config>
    <aop:pointcut expression="execution(* *.sleep(..))" id="sleepPointcut"/>
    <aop:advisor advice-ref="sleepHelper" pointcut-ref="sleepPointcut"/>
</aop:config>
<bean id="human" class="com.ghs.aop.Human"/>

下面是< aop:aspect>的實(shí)現(xiàn)方式:

//定義切面
public class SleepHelperAspect{
    public void beforeSleep(){
        System.out.println("睡覺前要脫衣服!");
    }
    public void afterSleep(){
        System.out.println("起床后要穿衣服!");
    }
}
//aop配置
<bean id="sleepHelperAspect" class="com.ghs.aop.SleepHelperAspect"></bean>
<aop:config>
    <aop:pointcut expression="execution(* *.sleep(..))" id="sleepPointcut"/>
    <aop:aspect ref="sleepHelperAspect">
        <!--前置通知-->
        <aop:before method="beforeSleep" pointcut-ref="sleepPointcut"/>
        <!--后置通知-->
        <aop:after method="afterSleep" pointcut-ref="sleepPointcut"/>
    </aop:aspect>
</aop:config>
<bean id="human" class="com.ghs.aop.Human"/>

測試代碼如下:

public class TestAOP {
    public static void main(String[] args) {
        method1();
//      method2();
    }
    private static void method1() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext1.xml");
        Sleepable sleeper = (Sleepable) context.getBean("human");
        sleeper.sleep();
    }
    private static void method2() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext2.xml");
        Sleepable sleeper = (Sleepable) context.getBean("human");
        sleeper.sleep();
    }

//執(zhí)行結(jié)果

睡覺前要脫衣服!

我要睡覺了!

起床后要穿衣服!

}

2、使用場景不同

< aop:advisor>大多用于事務(wù)管理。

例如:

<!-- 會(huì)重復(fù)讀,不會(huì)臟讀事務(wù) -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" timeout="120" propagation="REQUIRED" rollback-for="Exception" />
    </tx:attributes>
</tx:advice>
<aop:config proxy-target-class="true">
    <aop:pointcut id="txPointCut" expression="..."/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut" />
</aop:config>

< aop:aspect>大多用于日志,緩存

其實(shí),不管是< aop:advisor>還是< aop:aspect>最終的實(shí)現(xiàn)邏輯是一樣的。

小結(jié)

可以看出,< aop:advisor>和< aop:aspect>其實(shí)都是將通知和切面進(jìn)行了封裝,原理基本上是一樣的,只是使用的方式不同而已。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Quarkus集成open api接口使用swagger ui展示

    Quarkus集成open api接口使用swagger ui展示

    這篇文章主要為大家介紹了Quarkus集成open?api接口使用swagger?ui的展示示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • JAVA實(shí)現(xiàn)微信APPV3支付保姆級(jí)教程

    JAVA實(shí)現(xiàn)微信APPV3支付保姆級(jí)教程

    微信實(shí)現(xiàn)支付功能與支付寶實(shí)現(xiàn)支付功能是相似的,這篇文章主要介紹了JAVA實(shí)現(xiàn)微信APPV3支付的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • SpringMVC修改返回值類型后的消息轉(zhuǎn)換器處理方式

    SpringMVC修改返回值類型后的消息轉(zhuǎn)換器處理方式

    這篇文章主要介紹了SpringMVC修改返回值類型后的消息轉(zhuǎn)換器處理方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java 隨機(jī)生成6位短信驗(yàn)證碼實(shí)例代碼

    java 隨機(jī)生成6位短信驗(yàn)證碼實(shí)例代碼

    這篇文章主要介紹了java 隨機(jī)生成6位短信驗(yàn)證碼的實(shí)例代碼,文中給大家擴(kuò)展介紹了java隨機(jī)生成四位數(shù)字驗(yàn)證碼的方法,需要的朋友可以參考下
    2019-12-12
  • IntelliJ IDEA 2017.1.4 x64配置步驟(介紹)

    IntelliJ IDEA 2017.1.4 x64配置步驟(介紹)

    下面小編就為大家?guī)硪黄狪ntelliJ IDEA 2017.1.4 x64配置步驟(介紹)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • MyBatis集成Spring流程詳解

    MyBatis集成Spring流程詳解

    在實(shí)際開發(fā)中不僅僅是要展示數(shù)據(jù),還要構(gòu)成數(shù)據(jù)模型添加數(shù)據(jù),這篇文章主要介紹了SpringBoot集成Mybatis操作數(shù)據(jù)庫,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Springboot源碼 TargetSource解析

    Springboot源碼 TargetSource解析

    這篇文章主要介紹了Springboot源碼 TargetSource解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Spring基于常用AspectJ切點(diǎn)表達(dá)式使用介紹

    Spring基于常用AspectJ切點(diǎn)表達(dá)式使用介紹

    AspectJ是一個(gè)基于Java語言的AOP框架,使用AspectJ需要導(dǎo)入Spring?AOP和AspectJ相關(guān)jar包,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • windows下java環(huán)境變量的設(shè)置方法

    windows下java環(huán)境變量的設(shè)置方法

    在“系統(tǒng)變量”中,設(shè)置3項(xiàng)屬性,JAVA_HOME,PATH,CLASSPATH(大小寫無所謂),若已存在則點(diǎn)擊“編輯”,不存在則點(diǎn)擊“新建”
    2013-09-09
  • 淺談Java回收對象的標(biāo)記和對象的二次標(biāo)記過程

    淺談Java回收對象的標(biāo)記和對象的二次標(biāo)記過程

    這篇文章主要介紹了淺談Java回收對象的標(biāo)記和對象的二次標(biāo)記過程的相關(guān)內(nèi)容,小編覺得還是挺不錯(cuò)的,這里給大家分享一下,需要的朋友可以參考。
    2017-10-10

最新評論