日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

顺序执行_执行流程 | 你真的了解Spring AOP的执行顺序吗?

發布時間:2023/12/20 javascript 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 顺序执行_执行流程 | 你真的了解Spring AOP的执行顺序吗? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Hi! 我是小小,我們又見面了,今天的主要內容是,你真的了解Spring AOP的執行順序嗎?跟隨著我的腳步,一塊丈量世界,了解世界,重新認識,重新了解Spring AOP的執行順序。

聊一聊畢業四個月的感受

畢業四個月了,勞動合同還沒有簽,一切都沒有穩定下來,不過也似乎也將要穩定下來了,生活如流水一般非常平穩的運行著,而我的公眾號也在非常平穩的編寫著,當然啦,自己最喜歡聽的音樂也還是沒有變,MySoul,一成不變,似乎生活進入了穩定狀態,又或者生活沒有進入穩定狀態,我也不知道,只知道,這就是生活,唯有這樣的生活才能繼續進行。這四個月對我感覺,就是每天敲啊敲,每天的敲,拿著微薄的薪水,獲得著微薄的收入,或許這就是生活,自己的,也許這就是一個普通人,再也不能普通過的了生活了,好啦,不吐槽了,生活還需要繼續進行下去,我們隆重的開始今天的正文。

AOP核心概念

需要了解AOP,首先需要了解這些Spring AOP這些核心概念。

  • Aspect 切面:由一系列切點,增強和引入組成的模塊對象,可定義優先級,從而影響增強和引入的執行順序,事物管理,在Java中就是一個切面應用的例子。
  • Join point 接入點:程序執行期的一個點,例如方法執行,類初始化,異常處理,在Spring AOP中,接入點始終表示方法的執行。
  • Advice 增強切面在特點接入點的執行動作,包括 around,before,and after等多種類型,包含Spring在內的許多AOP框架,通常會使用攔截器來實現增強,圍繞著接入點維護一個攔截器鏈。
  • Pointcut 切點,用來匹配特定接入點的表達式,增強將會與切點表達式產生關聯,并運行在任何切點匹配到的接入點上,通過切點表達式匹配接入點是AOP的核心,Spring默認使用Aspect的切點表達式。
  • Introduction 引入:為某個type聲明額外的方法和字段,Spring AOP允許你引入任何接口以及它的默認實現到被掙錢對象上。
  • Target Object 目標對象,被一個或多個切面增強的對象,也被叫做被增強對象,既然Spring AOP使用運行時代理,那么目標對象就是代理對象。
  • AOP proxy AOP代理,為了實現切面功能一個對象會被AOP框架創建出來,在Spring框架中,AOP代理的默認方式是,有接口,就使用基于接口的jdk動態代理,否則使用基于類的CGLIB動態代理,但是我們可以通過設置proxy-target-完全使用CGLIB動態代理。
  • Weaving 織入,把一個或多個切面與類或對象鏈接在一起創建一個被增強對象,織入能發生在編譯時,加載時,或運行時,Spring AOP默認就是運行時織入,可以通過枚舉adviceMode來設置。
  • 模擬aspect advice的執行過程

    在這里我們不再展示測試代碼,而是通過簡單的代碼來模擬aspect advice的執行過程。

    話不多說,直接上代碼

    package doubt;
    public class AspectAdviceInvokeProcess {
    public static void main(String[] args){
    try {
    //正常執行
    AspectInvokeProcess(false);
    System.out.println("=====分割線=====");
    //異常執行
    AspectInvokeProcess(true);
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }

    /**
    * 切面執行過程
    * @param isException
    * @throws Exception
    */
    public static void AspectInvokeProcess(boolean isException) throws Exception{
    try {
    try {
    aroundAdvice(isException);
    } finally {
    afterAdvice();
    }
    afterReturningAdvice();
    return;
    } catch (Exception e) {
    afterThrowingAdvice(e);
    throw e;
    return;
    }
    }

    /**
    * 環繞增強
    * @param isException
    * @throws Exception
    */
    private static void aroundAdvice(boolean isException) throws Exception {
    System.out.println("around before advice");
    try {
    JoinPoint_Proceed(isException);
    } finally {
    System.out.println("around after advice");
    }
    }

    /**
    * 編織后的接入點執行過程
    * @param isException
    */
    public static void JoinPoint_Proceed(boolean isException){
    beforeAdvice();
    targetMethod(isException);
    }

    /**
    * 前置增強
    */
    private static void beforeAdvice() {
    System.out.println("before advice");
    }

    /**
    * 目標方法
    * @param isException
    */
    private static void targetMethod(boolean isException) {
    System.out.println("target method 執行");
    if(isException)
    throw new RuntimeException("異常發生");
    }

    /**
    * 后置增強
    */
    private static void afterAdvice() {
    System.out.println("after advice");
    }

    /**
    * 正常返回增強
    */
    private static void afterReturningAdvice() {
    System.out.println("afterReturning");
    }

    /**
    * 異常返回增強
    * @param e
    * @throws Exception
    */
    private static void afterThrowingAdvice(Exception e) throws Exception {
    System.out.println("afterThrowing:"+e.getMessage());
    }
    }

    執行結果

    上面代碼的執行結果如下,直接體現了同一aspect,不同advice的執行順序。

    around before advice
    before advice
    target method 執行
    around after advice
    after advice
    afterReturning
    ===============分割線==============
    around before advice
    before advice
    target method 執行
    around after advice
    after advice
    afterThrowing:異常發生
    java.lang.RuntimeException: 異常發生

    結果圖

    不同aspect,advice的執行順序

    Spring AOP 通過制定 aspect 的優先級,控制不同的 aspect,advice的執行順序。

  • Aspect 類添加注解:org.springframework.core.annotation.Order,使用注解value屬性指定優先級。
  • Aspect 類實現接口:org.springframework.core.Ordered,實現 Ordered 接口的 getOrder() 方法。
  • 其中,數值越低,表明優先級越高,@Order 默認為最低優先級,即最大數值:

    /**
    * Useful constant for the lowest precedence value.
    * @see java.lang.Integer#MAX_VALUE
    */
    int LOWEST_PRECEDENCE = Integer.MAX_VALUE;

    最終,不同aspect,advice的執行順序。

  • 入操作,接入點執行前,Brfore 優先級越高,越先執行。
  • 一個切面的入操作執行完,才到下一切面,所有切面入操作執行完,才開始執行接入點。
  • 出操作,優先級越低,越先執行。
  • 一個切面的出操作執行完,才到下一個切面,知道返回調用點。
  • 圖示

    同一切面,相同接入點

    其執行順序不能直接確定,有如下兩種變通方式

  • 將兩個 advice 合并為一個 advice,那么執行順序就可以通過代碼控制了
  • 將兩個 advice 分別抽離到各自的 aspect 內,然后為 aspect 指定執行順序
  • Spring 事物管理器

    Spring 事物管理器是基于Spring AOP的

    切面優先級

    切面優先級,默認為最低的優先級

    LOWEST_PRECEDENCE = Integer.MAX_VALUE

    關于作者

    我是小小,一枚生在二線,活在一線城市的程序猿,一直致力于奮斗在一線編碼,我是小小,我們下期再見。

    小明菜市場

    推薦閱讀

    ●?吊打面試官 | Java到底是值傳遞還是引用傳遞

    ●?容器 | Docker 如此之好,你為什么還要用k8s

    ●?分布式ID | 這六種分布式ID生成方法,總有一款適合你

    ●?數據結構與算法 | 來來來,讓我們重新認識一下什么是樹

    ●?面試官 | Java轉List三種方式,你說說吧。我。。懵逼。啥時候有三種了

    給我個好看再走好嗎?

    總結

    以上是生活随笔為你收集整理的顺序执行_执行流程 | 你真的了解Spring AOP的执行顺序吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。