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

Spring?AOP?的實現(xiàn)和切點表達式的實現(xiàn)方式

 更新時間:2024年12月13日 09:56:26   作者:2的n次方_  
本文給大家介紹了Spring?AOP的基本概念、通知類型、切點表達式和切面優(yōu)先級,并通過示例代碼展示了如何實現(xiàn)這些功能,感興趣的朋友跟隨小編一起看看吧

1. 快速入手

AOP:就是面相切面編程,切面指的就是某一類特定的問題,也可以理解為面相特定方法編程,例如之前使用的攔截器,就是 AOP 思想的一種應(yīng)用,統(tǒng)一數(shù)據(jù)返回格式和統(tǒng)一異常處理也是 AOP 思想的實現(xiàn)方式

比如說需要統(tǒng)計每個方法執(zhí)行的耗時,如果正常來寫的話,需要在方法的開頭和結(jié)尾來定義時間戳相減

如果有很多方法都需要計算的話,總不能每個方法都寫這些重復(fù)的代碼吧,接下來看通過使用 AOP 思想是如何實現(xiàn)的

首先需要添加對應(yīng)的依賴:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

然后需要添加@Component注解,

@Slf4j
@Aspect
@Component
public class TimeRecordAspect {
    @Around("execution(* com.example.springbook.controller.*.*(..))")
    public Object timeRecord(ProceedingJoinPoint pjt){
        //記錄開始時間
        long start = System.currentTimeMillis();
        //執(zhí)行目標(biāo)方法
        Object o = null;
        try {
            o = pjt.proceed();
        } catch (Throwable e){
            throw new RuntimeException(e);
        }
        log.info(pjt.getSignature() + "執(zhí)行耗時:" + (System.currentTimeMillis() - start));
        return o;
    }
}

再去調(diào)用接口的話就會計算出來對應(yīng)方法消耗的時間

來簡單分析一下上面的代碼:

2. 通知類型

Spring AOP 的通知類型有以下幾種

?@Around:環(huán)繞通知,在目標(biāo)方法前、后都被執(zhí)行。
?@Before:前置通知,在目標(biāo)方法前被執(zhí)行。
?@After:后置通知,在目標(biāo)方法后被執(zhí)行,無論是否有異常都會執(zhí)行。
?@AfterReturning:返回后通知,在目標(biāo)方法后被執(zhí)行,有異常不會執(zhí)行。
?@AfterThrowing:異常后通知,發(fā)生異常后執(zhí)行。

接下來同時測試一下這些通知類型,

來看一下接口正常返回的情況下的執(zhí)行順序

再來看接口發(fā)生異常的情況下的執(zhí)行順序:

從上面的結(jié)果上就可以看出,Around 可以完成其他類型的功能

需要注意的是:

  • @Around 環(huán)繞通知需要調(diào)用 ProceedingJoinPoint.proceed () 來讓原始方法執(zhí)行,其他通知不需要考慮目標(biāo)方法執(zhí)行。
  • @Around 環(huán)繞通知方法的返回值,必須指定為 Object,來接收原始方法的返回值,否則原始方法執(zhí)行完畢,是獲取不到返回值的。

3. @Pointcut

在上面的代碼中還存在一個問題,每次寫一個方法都需要寫一個切點表達式,如果說更換切點的話,那么所有的切點表達式都要修改一下,就可以通過@Pointcut 注解,把公共的切點表達式提取出來,需要用到時引用該切點表達式即可

這樣提取出來,其他方法想要調(diào)用直接寫上方法名稱即可,和定義的常量類似,那么同一個類下可以直接調(diào)用,如果是不同的類的話需要把全限定名寫上,并寫明是 xx 類的 xx 方法

@Around("com.example.springaop.aspect.AspectDemo.pt()")

執(zhí)行之后也是生效了

但是如果定義時設(shè)置為了 private 的話其他類就不能執(zhí)行了

@Pointcut("execution(* com.example.springaop.controller.*.*(..))")
private void pt(){
}

4. 切面優(yōu)先級

當(dāng)在一個項目中定義了多個切面類時,并且這些切面類的多個切入點都匹配到了同一個目標(biāo)方法,那么目標(biāo)方法執(zhí)行的時候,這些切面類中的通知方法都會執(zhí)行,那么這時就會有一個優(yōu)先級,哪個切面類先執(zhí)行

通過測試發(fā)現(xiàn),執(zhí)行的順序也是類似于一個切面的

關(guān)于切面類的執(zhí)行順序,默認(rèn)是按照類名的字典序來執(zhí)行的

可以@Order注解通過來修改優(yōu)先級

這樣 AspectDemo2 的優(yōu)先級就變?yōu)樽罡叩牧?,就先?zhí)行,也就是數(shù)字越大優(yōu)先級越高

5. 切點表達式

5.1. execution 表達式

訪問修飾符和異??梢允÷?/p>

  • * 表示通配符,匹配任意字符,不過只能匹配一個元素(即只能匹配任意一種返回類型,包名,類名,方法或者方法參數(shù)),一層包使用一個 *
  • ' . . ' 表示匹配多個連續(xù)的任意符號,可以通配任意層級的包,或者任意類型,任意個數(shù)的參數(shù),使用 .. 配置包名,表示此包以及此包下的所有子包

來看具體示例:

表示匹配 TestController 下的 public 修飾,返回類型為 String 方法名為 t1,無參方法

如果省略訪問修飾符,表示匹配 public 修飾或者 protected 修飾的方法

表示匹配所有返回類型

如果再把方法名設(shè)為 * 表示所有方法,上面就是匹配該類下的所有無參方法

如果設(shè)為 .. 就表示所有方法,無論有參還是無參都能匹配

表示 controller 包下的所有類的所有方法都匹配

表示 com 下類名為 TestController 的所有方法

表示 demo 下的所有包的所有類的所有方法 5.2. @annotation

使用 execution 表達式匹配的方法都是具有一定規(guī)律的,比如 xx 包的 xx 類的 xx 方法,那么如果沒有規(guī)律可循的話就需要使用 @annotation 注解了

首先,可以通過自定義注解的方式,自定義注解的創(chuàng)建需要選擇 @Annotation

@Retention(RetentionPolicy.RUNTIME) //注解的有效階段
@Target({ElementType.METHOD}) //表示方法注解
public @interface TimeRecord {
}

然后在原來計時的方法上來使用 @annotation 來指明要使用的注解

接下來只要是添加了自定義的注解都會執(zhí)行這里的方法

通過這種方式就實現(xiàn)了想要給哪個方法生效就直接加上注解就可以了

除了自定義注解,其他現(xiàn)存的注解也是可以這樣使用的

例如,可以把@RequestMapping的路徑寫在@annotation里,就表示只要加了@RequestMapping的方法都可以生效

到此這篇關(guān)于Spring AOP 的實現(xiàn)和切點表達式的實現(xiàn)方式的文章就介紹到這了,更多相關(guān)Spring AOP 切點表達式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot項目中使用Jsp的正確方法

    SpringBoot項目中使用Jsp的正確方法

    SpringBoot默認(rèn)是不支持JSP開發(fā)的,若是需要使用JSP的話便需要自己配置外部的tomcat,下面這篇文章主要給大家介紹了關(guān)于SpringBoot項目中使用Jsp的正確方法,需要的朋友可以參考下
    2023-05-05
  • SpringMVC結(jié)合Jcrop實現(xiàn)圖片裁剪

    SpringMVC結(jié)合Jcrop實現(xiàn)圖片裁剪

    這篇文章主要介紹了SpringMVC結(jié)合Jcrop實現(xiàn)圖片裁剪的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Spring @Configuration和@Component的區(qū)別

    Spring @Configuration和@Component的區(qū)別

    今天小編就為大家分享一篇關(guān)于Spring @Configuration和@Component的區(qū)別,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • SpringBoot配置系統(tǒng)全局異常映射處理

    SpringBoot配置系統(tǒng)全局異常映射處理

    在項目開發(fā)中,肯定少不了異常的出現(xiàn),作為后臺開發(fā)人員,我們總是在不停的寫各種接口提供給前端調(diào)用,然而不可避免的,當(dāng)后臺出現(xiàn)BUG時,前端總是丑陋的講錯誤信息直接暴露給用戶,這樣的用戶體驗想必是相當(dāng)差的,本文主要講解異常映射的配置
    2021-06-06
  • Mybatis逆工程jar包的修改和打包

    Mybatis逆工程jar包的修改和打包

    這篇文章主要介紹了Mybatis逆工程jar包的修改和打包的相關(guān)資料,需要的朋友可以參考下
    2016-06-06
  • Java簡易抽獎系統(tǒng)小項目

    Java簡易抽獎系統(tǒng)小項目

    這篇文章主要為大家詳細(xì)介紹了Java簡易抽獎系統(tǒng)小項目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Mybatis之Select Count(*)的獲取返回int的值操作

    Mybatis之Select Count(*)的獲取返回int的值操作

    這篇文章主要介紹了Mybatis之Select Count(*)的獲取返回int的值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Java反射如何有效的修改final屬性值詳解

    Java反射如何有效的修改final屬性值詳解

    最近在工作中遇到一個需求,要利用反射對修飾符為final的成員變量進行修改,所以這篇文章主要給大家介紹了關(guān)于Java反射如何有效的修改final屬性值的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對需要的朋友可以參考下。
    2017-08-08
  • java面向?qū)ο缶幊讨匾拍罾^承和多態(tài)示例解析

    java面向?qū)ο缶幊讨匾拍罾^承和多態(tài)示例解析

    這篇文章主要為大家介紹了java面向?qū)ο缶幊痰膬蓚€重要概念繼承和多態(tài)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • win11?idea?shift+F6快捷鍵失效問題解決方案

    win11?idea?shift+F6快捷鍵失效問題解決方案

    這篇文章主要介紹了win11?idea?shift+F6快捷鍵失效問題,本文給大家分享最新解決方案,需要的朋友可以參考下
    2023-08-08

最新評論