最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Boot?Aop執(zhí)行順序深入探究

 更新時間:2024年01月21日 09:57:12   作者:馮文議  
這篇文章主要為大家介紹了Spring?Boot?Aop執(zhí)行順序深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

Spring Boot Aop 執(zhí)行順序

1. 概述

在 spring boot 項目中,使用 aop 增強,不僅可以很優(yōu)雅地擴展功能,還可以讓一寫多用,避免寫重復代碼,例如:記錄接口耗時,記錄接口日志,接口權限,等等。所以,在項目中學習并使用 aop ,是十分必要的。然而,當我們在一個接口中使用多個 aop,時,就需要注意他們的執(zhí)行順序了。那么,它們的執(zhí)行順序是怎樣的呢?如果不把這個問題搞明白,那我們的程序就不可控,這是不允許的,這就是我們今天要討論的問題。

2. 實現 AOP

2.1 通過注解實現 AOP

MyAop:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAop {
}

MyAspect:

@Aspect
@Component
public class MyAspect {

    @Around("@annotation(aop)")
    public Object around(ProceedingJoinPoint joinPoint, 
                         MyAop aop) throws Throwable {
        return joinPoint.proceed();
    }

}

SampleController#myApi:

@RestController
@RequestMapping("/sample")
public class SampleController {
    @MyAop
    @RequestMapping("/my-api")
    public String myApi() {
        return "success";
    }
}

這樣,我們就通過使用注解的方式實現了 AOP 。

2.2 通過掃描包

比如,我們有這樣一個接口 SampleController#myApi2:

@RestController
@RequestMapping("/sample")
public class SampleController {

    @RequestMapping("/my-api2")
    public String myApi2() {
        return "success";
    }

}

我們可以使用包掃描的方式進行攔截:

@Aspect
@Component
public class My2Aspect {

    @Around("execution(* com.fengwenyi.demo.springboot.aop.controller.SampleController.myApi2(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        return joinPoint.proceed();
    }

}

這樣,我們也就通過使用包掃描的方式實現了 AOP 。

3. 多個 AOP

3.1 分析

先提一個疑問:多個AOP注解,執(zhí)行順序是怎么樣的呢?如何設置執(zhí)行順序呢?

比如,APP 請求我們的 API 接口,在請求到達 API 接口之前,可以先執(zhí)行 AOP1,在執(zhí)行 AOP2,并且順序不能變,如下圖:

我們再拆解一下實際內部執(zhí)行邏輯。

請求:請求先進入到 AOP1,再進入到 AOP2,最后到達 API。

返回:執(zhí)行完 API,再回到 AOP2,最后回到 AOP1。

如下圖:

因為我們用的是 Around,先進入Aop1,再進入到aop2,然后執(zhí)行api,執(zhí)行完以后,再返回到 aop2,最后返回aop1。

3.2 代碼實現

MyFirstAop:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyFirstAop {
}

MyFirstAspect:

@Slf4j
@Aspect
@Component
@Order(100002)
public class MyFirstAspect {
    @Around("@annotation(aop)")
    public Object around(ProceedingJoinPoint joinPoint, 
                         MyFirstAop aop) throws Throwable {
        log.info("MyFirstAspect#around execute start");
        try {
            return joinPoint.proceed();
        } finally {
            log.info("MyFirstAspect#around execute end");
        }
    }
}

MySecondAop:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MySecondAop {
}

MySecondAspect:

@Slf4j
@Aspect
@Component
@Order(100003)
public class MySecondAspect {
    @Around("@annotation(aop)")
    public Object around(ProceedingJoinPoint joinPoint, 
                         MySecondAop aop) throws Throwable {
        log.info("MySecondAspect#around execute start");
        try {
            return joinPoint.proceed();
        } finally {
            log.info("MySecondAspect#around execute end");
        }
    }
}

SampleController#aopOrder:

@RestController
@RequestMapping("/sample")
public class SampleController {

    @MySecondAop
    @MyFirstAop
    @RequestMapping("/aop-order")
    public String aopOrder() {
        return "aopOrder";
    }

}

通過設定 Order 值,指定 AOP 執(zhí)行順序,與我們的期望一致。

好了,今天的分享就到這里了,源碼:demo-spring-boot-aop。

以上就是Spring Boot Aop 執(zhí)行順序的詳細內容,更多關于Spring Boot Aop 執(zhí)行順序的資料請關注腳本之家其它相關文章!

相關文章

  • Spring MVC 響應處理頁面、數據與狀態(tài)配置的方法

    Spring MVC 響應處理頁面、數據與狀態(tài)配置的方法

    本文給大家介紹Spring MVC 響應處理頁面、數據與狀態(tài)配置的相關知識,本文結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-11-11
  • Java中的Hashtable源碼詳細解析

    Java中的Hashtable源碼詳細解析

    這篇文章主要介紹了Java中的Hashtable源碼詳細解析,Hashtable 的函數都是同步的,這意味著它是線程安全的,它的key、value都不可以為null,此外,Hashtable中的映射不是有序的,需要的朋友可以參考下
    2023-11-11
  • Spring中事務管理的四種方法(銀行轉賬為例)

    Spring中事務管理的四種方法(銀行轉賬為例)

    這篇文章主要給大家介紹了關于Spring中事務管理的四種方法,文中是以銀行轉賬為例,通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-05-05
  • Spring手動獲取bean的四種方式

    Spring手動獲取bean的四種方式

    本文主要介紹了Spring手動獲取bean的四種方式,包括BeanFactoryPostProcessor接口,ApplicationContextAware接口,注解 @PostConstruct 初始化時獲取,啟動類ApplicationContext獲取這四種方法,感興趣的可以了解一下
    2024-01-01
  • java虛擬機多線程進階篇總結

    java虛擬機多線程進階篇總結

    在本篇內容里小編給大家整理了關于java虛擬機多線程進階篇的相關知識點內容,有興趣的朋友們跟著參考下。
    2019-06-06
  • java中Map遍歷的四種方式總結

    java中Map遍歷的四種方式總結

    Map集合遍歷日常開發(fā)最常使用,下面這篇文章主要給大家總結介紹了關于java中Map遍歷的四種方式,文中通過實例代碼介紹的非常詳細,對大家學習或者使用java具有一定的參考學習價值,需要的朋友可以參考下
    2023-03-03
  • Java編程中的equals方法使用全解

    Java編程中的equals方法使用全解

    這篇文章主要介紹了Java編程中的equals方法使用全解,是Java入門學習中的基礎知識,需要的朋友可以參考下
    2015-10-10
  • Java 單例模式詳細解釋

    Java 單例模式詳細解釋

    這篇文章主要給大家介紹了關于Java中四種單例模式的相關資料,其中包括餓漢式、懶漢式、懶漢式(雙重鎖)及內部類等四種,分別給出了詳細的示例代碼和介紹,需要的朋友們下面來一起看看吧。
    2021-11-11
  • Java中關鍵字synchronized的使用方法詳解

    Java中關鍵字synchronized的使用方法詳解

    synchronized關鍵字可以作為函數的修飾符,也可作為函數內的語句,也就是平時說的同步方法和同步語句塊,下面這篇文章主要給大家介紹了關于Java中synchronized使用的相關資料,需要的朋友可以參考下
    2021-08-08
  • JAVA一個快速排序實現代碼

    JAVA一個快速排序實現代碼

    排序有哪幾種方法?請列舉。并用JAVA實現一個快速排序.,需要的朋友可以參考下
    2017-02-02

最新評論

灵山县| 张家口市| 邓州市| 扶绥县| 迭部县| 海伦市| 贡嘎县| 噶尔县| 定安县| 漳浦县| 龙游县| 交城县| 开远市| 日喀则市| 红安县| 五台县| 白水县| 红桥区| 镇平县| 武胜县| 沙坪坝区| 邵东县| 蓬莱市| 专栏| 洛阳市| 宜兰县| 永顺县| 榆林市| 台南市| 蕉岭县| 榆树市| 扶风县| 浮梁县| 富川| 海林市| 绵竹市| 礼泉县| 云龙县| 丰镇市| 突泉县| 昌吉市|