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

SpringBoot整合AOP及使用案例實(shí)戰(zhàn)

 更新時(shí)間:2025年12月08日 11:09:57   作者:BileiX  
本文詳細(xì)介紹了Spring AOP中的切入點(diǎn)表達(dá)式,重點(diǎn)講解了execution表達(dá)式的語法和用法,通過案例實(shí)戰(zhàn),展示了AOP的基本使用、結(jié)合自定義注解以及環(huán)繞通知的實(shí)現(xiàn),感興趣的朋友跟隨小編一起看看吧

一、 引入依賴

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

二、切入點(diǎn)表達(dá)式詳解

切入點(diǎn)表達(dá)式用于定義在哪些連接點(diǎn)應(yīng)用增強(qiáng),可以組合并使用execution、within 、 @annotation 、@within 、@target、args、bean這幾種表達(dá)式。

本文只介紹最常用的execution表達(dá)式。

execution表達(dá)式語法:execution([修飾符] 返回類型 [聲明類型].方法名(參數(shù)) [異常])

* :匹配任意數(shù)量的字符(除了包分隔符.)
.. :匹配任意數(shù)量的字符(包括包分隔符.)或任意數(shù)量的參數(shù)
+ :匹配指定類型的子類型
@Aspect
@Component
public class TestAop {
    // 1.匹配特定類的特定方法
    @Pointcut("execution(public void com.example.demo.controller.AopTestController.testAop(..))")
    public void testAopMethod1() {
    }
    // 2.匹配特定類的特定方法,訪問修飾符可以省略
    @Pointcut("execution(void com.example.demo.controller.AopTestController.testAop(..))")
    public void testAopMethod2() {
    }
    // 3.匹配特定類的特定方法,返回值可以使用通配符 * 表示任意返回值
    @Pointcut("execution(* com.example.demo.controller.AopTestController.testAop(..))")
    public void testAopMethod3() {
    }
    // 4.包名可以使用通配符表示任意包,但是有幾級(jí)包就需要寫幾個(gè) *
    @Pointcut("execution(* *.*.*.*.AopTestController.testAop(..))")
    public void testAopMethod4() {
    }
    // 5.包名可以使用 .. 表示當(dāng)前包及其子包
    @Pointcut("execution(* *..AopTestController.testAop(..))")
    public void testAopMethod5() {
    }
    // 6.類名和方法名都可以使用 * 來實(shí)現(xiàn)通配
    @Pointcut("execution(* *..*.*(..))")
    public void testAopMethod6() {
    }
    // 7. 匹配特定接口的所有實(shí)現(xiàn)方法
    @Pointcut("execution(* com.example.demo.controller.AopTestController+.*(..))")
    public void testAopMethod7() {
    }
}

三、案例實(shí)戰(zhàn)

1. AOP基本使用

① 待增強(qiáng)的業(yè)務(wù)代碼:

@RestController
public class AopTestController {
    @GetMapping("/testAop")
    public Object testAop() {
        return "testAop";
    }
    @GetMapping("/testAopException")
    public Object testAopException() {
        return 1 / 0;
    }
}

② AOP切面:

@Aspect
@Component
public class AopTestAspect {
    @Pointcut("execution(public * com.example.demo.controller.AopTestController.testAop(..)) " +
            "|| execution(public * com.example.demo.controller.AopTestController.testAopException(..))")
    public void log() {
    }
    @Before("log()")
    public void deBefore(JoinPoint joinPoint) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        System.out.println("URL : " + request.getRequestURL().toString());
        System.out.println("HTTP_METHOD : " + request.getMethod());
        System.out.println("CLASS_METHOD : " + joinPoint);
        System.out.println("ARGS : " + Arrays.toString(joinPoint.getArgs()));
        System.out.println("前置通知:方法執(zhí)行前執(zhí)行...");
    }
    //返回通知
    @AfterReturning(returning = "result", pointcut = "log()")
    public void doAfterReturning(Object result) {
        System.out.println("返回通知:方法成功執(zhí)行并返回后執(zhí)行...");
        System.out.println("方法的返回值: " + result);
    }
    //異常通知
    @AfterThrowing(throwing = "exception", pointcut = "log()")
    public void doThrowing(JoinPoint joinPoint, Exception exception) {
        System.out.println("異常通知:方法異常時(shí)執(zhí)行...");
        System.out.println("產(chǎn)生異常的方法:" + joinPoint);
        System.out.println("異常種類:" + exception);
    }
    //后置通知
    @After("log()")
    public void doAfter(JoinPoint joinPoint) {
        System.out.println("后置通知:最后且一定執(zhí)行...");
    }
}

③ 控制臺(tái)打?。?/strong>

2. AOP結(jié)合自定義注解

① 自定義注解:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnnotation {
    String desc() default " ";
}

② 待增強(qiáng)的業(yè)務(wù)代碼:

@RestController
public class AopTestController {
    @GetMapping("testAopAnnotation")
    @LogAnnotation(desc = "測試注解類型:testAopAnnotation")
    public Object testAopAnnotation() {
        return "testAopAnnotation";
    }
}

③ AOP切面:

@Aspect
@Component
public class AopAnnotationTestAspect {
    @Pointcut(value = "@annotation(com.example.demo.annotation.LogAnnotation)")
    public void logAction() {
    }
    @Before("logAction() && @annotation(logAnnotation)")
    public void doBefore(JoinPoint joinPoint, LogAnnotation logAnnotation) {
        System.out.println("前置通知:方法執(zhí)行前執(zhí)行...");
        System.out.println("doBefore注解的值:" + logAnnotation.desc());
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        System.out.println("URL: " + attributes.getRequest().getRequestURL().toString());
    }
    @AfterReturning(returning = "result", pointcut = "logAction() && @annotation(logAnnotation)")
    public void doAfterReturning(Object result, LogAnnotation logAnnotation) {
        System.out.println("doAfterReturning注解的值:" + logAnnotation.desc());
        System.out.println("返回通知:方法成功執(zhí)行并返回后執(zhí)行...");
        System.out.println("方法的返回值: " + result);
    }
    @AfterThrowing(throwing = "exception", pointcut = "logAction() && @annotation(logAnnotation)")
    public void doThrows(JoinPoint joinPoint, Exception exception, LogAnnotation logAnnotation) {
        System.out.println("doThrows注解的值" + logAnnotation.desc());
        System.out.println("異常通知:方法異常時(shí)執(zhí)行...");
        System.out.println("產(chǎn)生異常的方法:" + joinPoint);
        System.out.println("異常種類:" + exception);
    }
    @After("logAction() && @annotation(logAnnotation)")
    public void doAfter(JoinPoint joinPoint, LogAnnotation logAnnotation) {
        System.out.println("doAfter注解的值:" + logAnnotation.desc());
        System.out.println("后置通知:最后且一定執(zhí)行...");
    }
}

④ 控制臺(tái)打印:

3. 環(huán)繞通知

1. 非注解模式

① 待增強(qiáng)業(yè)務(wù)代碼:

@RestController
public class AopTestController {
    @GetMapping("/testAopAround")
    public Object testAopAround() {
        return "testAopAround";
    }
}

② AOP切面:

@Aspect
@Component
public class AopAroundTestAspect {
    @Pointcut("execution(public * com.example.demo.controller.AopTestController.testAopAround(..))")
    public void logAround() {
    }
    @Around("logAround()")
    public Object aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {
        try {
            Object[] args = proceedingJoinPoint.getArgs();
            System.out.println("通知類中的aroundAdvice方法執(zhí)行前...");
            // 明確調(diào)用切入點(diǎn)方法
            Object resValue = proceedingJoinPoint.proceed(args);
            System.out.println("通知類中的aroundAdvice方法執(zhí)行后...返回值:" + resValue);
            return resValue;
        } catch (Throwable e) {
            System.out.println("通知類中的aroundAdvice方法執(zhí)行異常...");
            throw new RuntimeException(e);
        } finally {
            System.out.println("通知類中的aroundAdvice方法執(zhí)行完成...");
        }
    }
}

③ 控制臺(tái)打?。?/strong>

2. 注解模式

① 自定義注解:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnnotation {
    String desc() default " ";
}

② 待增強(qiáng)的業(yè)務(wù)代碼:

@RestController
public class AopTestController {
    @GetMapping("/testAopAroundAnnotation")
    @LogAnnotation(desc = "測試注解類型:testAopAroundAnnotation")
    public Object testAopAroundAnnotation(){
        return "testAopAroundAnnotation";
    }
}

③ AOP切面:

@Aspect
@Component
public class AopAroundAnnotationTestAspect {
    @Pointcut(value = "@annotation(com.example.demo.annotation.LogAnnotation)")
    public void logAroundAnnotation() {
    }
    @Around("logAroundAnnotation() && @annotation(logAnnotation)")
    public Object aroundAnnotationAdvice(ProceedingJoinPoint proceedingJoinPoint, LogAnnotation logAnnotation) {
        try {
            System.out.println("logAnnotation注解的值:" + logAnnotation.desc());
            Object[] args = proceedingJoinPoint.getArgs();
            System.out.println("通知類中的aroundAnnotationAdvice方法執(zhí)行前...");
            // 明確調(diào)用切入點(diǎn)方法
            Object resValue = proceedingJoinPoint.proceed(args);
            System.out.println("通知類中的aroundAnnotationAdvice方法執(zhí)行后...返回值:" + resValue);
            return resValue;
        } catch (Throwable e) {
            System.out.println("通知類中的aroundAnnotationAdvice方法執(zhí)行異常...");
            throw new RuntimeException(e);
        } finally {
            System.out.println("通知類中的aroundAnnotationAdvice方法執(zhí)行完成...");
        }
    }
}

④ 控制臺(tái)打印:

到此這篇關(guān)于SpringBoot整合AOP及使用案例實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)SpringBoot整合AOP內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 擴(kuò)展tk.mybatis的流式查詢功能實(shí)現(xiàn)

    擴(kuò)展tk.mybatis的流式查詢功能實(shí)現(xiàn)

    mybatis查詢默認(rèn)是一次獲取全部,如果數(shù)據(jù)過于龐大,就會(huì)導(dǎo)致OOM問題,本文就介紹了tk.mybatis 流式查詢,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-12-12
  • 大數(shù)據(jù) java hive udf函數(shù)的示例代碼(手機(jī)號(hào)碼脫敏)

    大數(shù)據(jù) java hive udf函數(shù)的示例代碼(手機(jī)號(hào)碼脫敏)

    這篇文章主要介紹了大數(shù)據(jù) java hive udf函數(shù)(手機(jī)號(hào)碼脫敏),的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • JPA中EntityListeners注解的使用詳解

    JPA中EntityListeners注解的使用詳解

    這篇文章主要介紹了JPA中EntityListeners注解的使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • Java查找并高亮PDF文本過程解析

    Java查找并高亮PDF文本過程解析

    這篇文章主要介紹了Java查找并高亮PDF文本過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Java圖片處理之獲取gif圖一幀圖片的兩種方法

    Java圖片處理之獲取gif圖一幀圖片的兩種方法

    這篇文章主要給大家介紹了關(guān)于Java圖片處理之獲取gif圖一幀圖片的兩種方法,分別是利用Java原生代碼和使用im4java調(diào)用ImageMagick來實(shí)現(xiàn),兩種方法都給出來示例代碼供大家參考學(xué)習(xí),需要的朋友們下面來一起看看吧。
    2017-10-10
  • Java隨手筆記8之包、環(huán)境變量和訪問控制及maven profile實(shí)現(xiàn)多環(huán)境打包

    Java隨手筆記8之包、環(huán)境變量和訪問控制及maven profile實(shí)現(xiàn)多環(huán)境打包

    這篇文章主要介紹了Java隨手筆記8之包、環(huán)境變量和訪問控制及maven profile實(shí)現(xiàn)多環(huán)境打包的相關(guān)資料,需要的朋友可以參考下
    2015-11-11
  • Java解密微信小程序手機(jī)號(hào)的方法

    Java解密微信小程序手機(jī)號(hào)的方法

    這篇文章主要為大家詳細(xì)介紹了Java解密微信小程序手機(jī)號(hào)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • SpringBoot自定義Starter的教程指南

    SpringBoot自定義Starter的教程指南

    SpringBoot的Starter自動(dòng)配置機(jī)制極大地簡化了依賴管理和應(yīng)用配置,使得開發(fā)者可以以最少的配置快速啟動(dòng)和運(yùn)行Spring應(yīng)用,有時(shí),標(biāo)準(zhǔn)的Starter可能無法滿足特定需求,需要?jiǎng)?chuàng)建自定義Starter,所以本文給大家介紹了SpringBoot自定義Starter的教程指南
    2024-11-11
  • 深度解析Spring AOP @Aspect 原理、實(shí)戰(zhàn)與最佳實(shí)踐教程

    深度解析Spring AOP @Aspect 原理、實(shí)戰(zhàn)與最佳實(shí)踐教程

    文章系統(tǒng)講解了Spring AOP核心概念、實(shí)現(xiàn)方式及原理,涵蓋橫切關(guān)注點(diǎn)分離、代理機(jī)制(JDK/CGLIB)、切入點(diǎn)類型、性能優(yōu)化、常見陷阱及解決方案,并對比了SpringAOP與AspectJ的編譯時(shí)織入特性,強(qiáng)調(diào)合理應(yīng)用場景與避免濫用的重要性,感興趣的朋友一起看看吧
    2025-06-06
  • Java函數(shù)式編程(十一):遍歷目錄

    Java函數(shù)式編程(十一):遍歷目錄

    這篇文章主要介紹了Java函數(shù)式編程(十一):遍歷目錄,本文是系列文章的第11篇,其它文章請參閱本文底部的相關(guān)文章,需要的朋友可以參考下
    2014-09-09

最新評論

安西县| 酒泉市| 长岭县| 章丘市| 怀安县| 襄垣县| 六枝特区| 丹棱县| 印江| 图木舒克市| 佳木斯市| 宜城市| 常宁市| 桂阳县| 龙山县| 尼玛县| 松潘县| 白玉县| 西平县| 如东县| 嫩江县| 新源县| 富民县| 罗平县| 原阳县| 鄂伦春自治旗| 永吉县| 鄯善县| 靖安县| 兰西县| 桑日县| 靖宇县| 双桥区| 公主岭市| 克东县| 岳阳县| 农安县| 荔浦县| 保德县| 宁乡县| 尼木县|