亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringAOP中的通知Advice解析

 更新時間:2023年09月27日 09:00:09   作者:purple.taro  
這篇文章主要介紹了SpringAOP中的通知Advice解析,AOP 中的通知是基于連接點業(yè)務邏輯的一種增強,Spring AOP 可以基于 XML 方式和基于注解方式定義,只是寫法不同,這里只使用注解的方式來講解通知的詳細用法,需要的朋友可以參考下

一、概述

AOP 中的通知是基于連接點(Join point)業(yè)務邏輯的一種增強,Spring AOP 提供了下面五種通知類型:

  1. Before advice(前置通知):連接點前面執(zhí)行,不能終止后續(xù)流程,除非拋異常
  2. After returning advice(后置通知):連接點正常返回時執(zhí)行,有異常不執(zhí)行
  3. Around advice(環(huán)繞通知):圍繞連接點前后執(zhí)行,也能捕獲異常處理
  4. After advice(最終通知):連接點退出時執(zhí)行,無論是正常退出還是異常退出
  5. After throwing advice(異常通知):連接點方法拋出異常時執(zhí)行

AOP 的連接點一般是指目標類的方法,五種通知類型執(zhí)行的節(jié)點如下:

二、通知的定義

Spring AOP 可以基于 XML 方式和基于注解方式定義,只是寫法不同,這里只使用注解的方式來講解通知的詳細用法。

1. 前置通知

在 @Aspect 切面類中使用 @Before 注解簡單地定義一個前置通知。

@Aspect
@Component
public class DemoAspect {
    @Before("execution(* cn.codeartist.spring.aop.advice.*.*(..))")
    public void doBefore() {
        // 自定義邏輯
    }
}

2. 后置通知

方法正常返回,會執(zhí)行后置通知,使用 @AfterReturning 注解定義后置通知。

@AfterReturning("execution(* cn.codeartist.spring.aop.advice.*.*(..))")
public void doAfterReturning() {
    // 自定義邏輯
}

注解的 returning 屬性可以綁定目標方法返回值,用于在通知中獲取目標方法執(zhí)行完成后的返回結果。

@AfterReturning(pointcut = "pointcut()", returning = "retVal")
public void doAfterReturning(Object retVal) {
    // 自定義邏輯(通過參數綁定方法切入點方法的返回值)
}

當注解使用了 returning 屬性時,切入點會增加返回值類型的限制,上面使用的 Object 類型可以匹配到所有返回值類型的目標方法。

例如下面的情況,后置通知的代碼不會被執(zhí)行:

// 目標方法
public String doService() {
    return "碼匠公眾號";
}
// 后置通知定義
@AfterReturning(pointcut = "pointcut()", returning = "retVal")
public void doAfterReturning(Integer retVal) {
    // 目標方法返回值是String類型,結果參數綁定類型是Integer,該通知不會被執(zhí)行
}

3. 環(huán)繞通知

環(huán)繞通知可以在方法執(zhí)行的任何節(jié)點添加邏輯,它可以實現另外 4 種通知的功能。

如果需要以線程安全的方式在方法執(zhí)行前后共享狀態(tài),可以使用環(huán)繞通知。

用 @Around 注解來定義環(huán)繞通知,需要使用 ProceedingJoinPoint 作為參數,來執(zhí)行目標方法調用。

@Around("execution(* cn.codeartist.spring.aop.advice.*.*(..))")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
    // 方法執(zhí)行前邏輯
    Object retVal = joinPoint.proceed();
    // 方法執(zhí)行后邏輯
    return retVal;
}

joinPoint.proceed() 會調用目標方法,或者是調用另一個切面。

雖然環(huán)繞通知可以實現另外幾種通知的功能,但在使用中都能實現功能的情況下,優(yōu)先使用其他通知方式。

4. 最終通知

最終通知在方法退出的時候執(zhí)行,使用 @After 注解定義,最終通知在方法正常退出和拋出異常時都會執(zhí)行,通常用于資源的釋放。

@After("execution(* cn.codeartist.spring.aop.advice.*.*(..))")
public void doAfter() {
    // 自定義邏輯
}

5. 異常通知

方法拋出異常的時候會執(zhí)行異常通知,使用 @AfterThrowing 定義異常通知。

@AfterThrowing("execution(* cn.codeartist.spring.aop.advice.*.*(..))")
public void doAfterThrowing() {
    // 自定義邏輯
}

注解的 throwing 屬性用來綁定目標方法拋出的異常,用于在通知中獲取目標方法拋出的異常實例。

@AfterThrowing(pointcut = "pointcut()", throwing = "ex")
public void doAfterThrowing(Throwable ex) {
    // 自定義邏輯(通過參數綁定方法切入點方法拋出的異常)
}

當注解使用了 throwing 屬性時,切入點會增加異常類型的限制,上面使用的 Throwable 類型可以匹配到所有異常類型。

例如下面的情況,異常通知的代碼不會被執(zhí)行:

// 目標方法
public void doServiceThrow() {
    throw new RuntimeException("Test exception");
}
// 異常通知定義
@AfterThrowing(pointcut = "pointcut()", throwing = "ex")
public void doAfterThrowing(NullPointerException ex) {
    // 目標方法拋出的是RuntimeException,參數綁定類型是NullPointerException,該通知不會被執(zhí)行
}

三、通知的參數

在定義通知的方法簽名上可以指定參數來綁定目標方法的一些信息(例如前面講到的后置通知和異常通知)。

1. 切入點

在定義通知方法的時候,一般可以使用 JoinPoint 作為參數,環(huán)繞通知使用 ProceedingJoinPoint 。常用接口方法如下:

JoinPoint

public interface JoinPoint {
  // 獲取代理對象
    Object getThis();
    // 獲取目標對象
    Object getTarget();
    // 獲取連接點方法的參數
    Object[] getArgs();
    // 獲取連接點方法的簽名
    Signature getSignature();
}

ProceedingJoinPoint

public interface ProceedingJoinPoint extends JoinPoint {
    // 執(zhí)行下一個切面的通知或者目標方法
    public Object proceed() throws Throwable;
    // 執(zhí)行下一個切面的通知或者目標方法(帶參數)
    public Object proceed(Object[] args) throws Throwable;
}

切面的切入點一般為方法,所以 Signature 可以轉換為 MethodSignature 使用。

2. 通知的參數傳遞

通知的參數可以通過切點表達式 args 來指定,具體用法會在后面切點表達式詳解中講到。

@Before("pointcut() && args(name,..)")
public void doBefore(String name) {
    // 切點表達式增加參數匹配
}

args(name,..) 也會增加切入點的限制,目標方法的參數個數至少為一個,且第一個參數類型為 String 。

四、通知的順序

Spring AOP 中一個目標類可以被多個切面切入,多個切面也可以切入一個目標類。

使用 @Order 注解來指定切面的優(yōu)先級,來控制切面的執(zhí)行順序。

在注冊切面 Bean 的時候指定 @Order ,如下:

@Order(1)
@Aspect
@Component
public class FirstAspect {
    // ......
}

優(yōu)先級高的切面先執(zhí)行,通知執(zhí)行的順序如下:

可以得出:

  • 優(yōu)先級高的切面,前置通知先執(zhí)行
  • 優(yōu)先級低的切面,后置通知先執(zhí)行
  • Order 值越小,優(yōu)先級越大。

Spring AOP 是基于動態(tài)代理的攔截器模式實現的,切面模型與攔截器模型相似,如下:

五、附錄

1. 常用注解

注解描述
@Aspect定義切面類
@Before定義前置通知
@AfterReturning定義后置通知
@Around定義環(huán)繞通知
@After定義最終通知
@AfterThrowing定義異常通知

到此這篇關于SpringAOP中的通知Advice解析的文章就介紹到這了,更多相關通知Advice解析內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot?jackson提供對LocalDate的支持方式

    SpringBoot?jackson提供對LocalDate的支持方式

    這篇文章主要介紹了SpringBoot?jackson提供對LocalDate的支持方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringSecurity實現動態(tài)權限校驗的過程

    SpringSecurity實現動態(tài)權限校驗的過程

    Spring Security過濾器鏈中,AuthorizationFilter的authorizationManager是我們要找的組件,該組件的check方法已被棄用,推薦使用authorize方法,最終通過接口路徑和權限進行校驗,本文給大家介紹SpringSecurity實現動態(tài)權限校驗的相關知識,感興趣的朋友一起看看吧
    2025-02-02
  • 詳解SpringBoot之訪問靜態(tài)資源(webapp...)

    詳解SpringBoot之訪問靜態(tài)資源(webapp...)

    這篇文章主要介紹了詳解SpringBoot之訪問靜態(tài)資源(webapp...),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • java代碼抓取網頁郵箱的實現方法

    java代碼抓取網頁郵箱的實現方法

    下面小編就為大家?guī)硪黄猨ava代碼抓取網頁郵箱的實現方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • java虛擬機jvm方法區(qū)實例講解

    java虛擬機jvm方法區(qū)實例講解

    在本篇文章里小編給大家整理的是一篇關于java虛擬機jvm方法區(qū)實例講解內容,有興趣的朋友們可以學習下。
    2021-02-02
  • Java超詳細講解設計模式中的命令模式

    Java超詳細講解設計模式中的命令模式

    命令模式是將一個請求封裝為一個對象,從而可用不同的請求對客戶進行參數化,對請求排隊或者對請求做日志記錄,以及可以支持撤銷的操作
    2022-04-04
  • SpringBoot 整合 Avro 與 Kafka的詳細過程

    SpringBoot 整合 Avro 與 Kafka的詳細過程

    本文介紹了如何在Spring Boot中使用Avro和Kafka進行數據的序列化和反序列化,并通過MyBatisPlus將數據存入數據庫,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • 詳解Spring/Spring boot異步任務編程WebAsyncTask

    詳解Spring/Spring boot異步任務編程WebAsyncTask

    這篇文章主要介紹了詳解Spring/Spring boot異步任務編程WebAsyncTask,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Java的Atomic原子類詳解

    Java的Atomic原子類詳解

    這篇文章主要介紹了Java的Atomic原子類詳解,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • SpringBoot JVM參數調優(yōu)方式

    SpringBoot JVM參數調優(yōu)方式

    這篇文章主要介紹了SpringBoot JVM參數調優(yōu)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論