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

SpringBoot如何使用@Aspect注解實現(xiàn)AOP

 更新時間:2023年07月28日 08:38:58   作者:wuychn  
這篇文章主要介紹了SpringBoot如何使用@Aspect注解實現(xiàn)AOP問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

使用@Aspect 注解實現(xiàn)AOP

AOP(Aspect Oriented Programming,面向切面編程)是通過預(yù)編譯方式和運行期動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護的一種技術(shù)。

AOP是OOP的延續(xù),是軟件開發(fā)中的一個熱點,也是Spring框架中的一個重要內(nèi)容,是函數(shù)式編程的一種衍生范型。

利用AOP可以對業(yè)務(wù)邏輯的各個部分進行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效率。

在Spring AOP中業(yè)務(wù)邏輯僅僅只關(guān)注業(yè)務(wù)本身,將日志記錄、性能統(tǒng)計、安全控制、事務(wù)處理、異常處理等代碼從業(yè)務(wù)邏輯代碼中劃分出來,從而在改變這些行為的時候不影響業(yè)務(wù)邏輯的代碼。

相關(guān)注解介紹

注解作用
@Aspect把當前類標識為一個切面
@PointcutPointcut是織入Advice的觸發(fā)條件。每個Pointcut的定義包括2部分,一是表達式,二是方法簽名。方法簽名必須是public及void型??梢詫ointcut中的方法看作是一個被Advice引用的助記符,因為表達式不直觀,因此我們可以通過方法簽名的方式為此表達式命名。因此Pointcut中的方法只需要方法簽名,而不需要在方法體內(nèi)編寫實際代碼。
@Around環(huán)繞增強,目標方法執(zhí)行前后分別執(zhí)行一些代碼
@AfterReturning返回增強,目標方法正常執(zhí)行完畢時執(zhí)行
@Before前置增強,目標方法執(zhí)行之前執(zhí)行
@AfterThrowing異常拋出增強,目標方法發(fā)生異常的時候執(zhí)行
@After后置增強,不管是拋出異?;蛘哒M顺龆紩?zhí)行

一、添加依賴

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

二、編寫增強類

package com.wuychn.springbootaspect.aspect;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Aspect
@Component
@Slf4j
public class LogAspect {
    /**
     * 前置增強:目標方法執(zhí)行之前執(zhí)行
     *
     * @param jp
     */
    @Before("execution(* com.wuychn.springbootaspect.controller.*.*(..))") // 所有controller包下面的所有方法的所有參數(shù)
    public void beforeMethod(JoinPoint jp) {
        String methodName = jp.getSignature().getName();
        log.info("【前置增強】the method 【" + methodName + "】 begins with " + JSON.toJSONString(jp.getArgs()));
    }
    /**
     * 后置增強:目標方法執(zhí)行之后執(zhí)行以下方法體的內(nèi)容,不管是否發(fā)生異常。
     *
     * @param jp
     */
    @After("execution(* com.wuychn.springbootaspect.controller.*.*(..)))")
    public void afterMethod(JoinPoint jp) {
        log.info("【后置增強】this is a afterMethod advice...");
    }
    /**
     * 返回增強:目標方法正常執(zhí)行完畢時執(zhí)行
     *
     * @param jp
     * @param result
     */
    @AfterReturning(value = "execution(* com.wuychn.springbootaspect.controller.*.*(..)))", returning = "result")
    public void afterReturningMethod(JoinPoint jp, Object result) {
        String methodName = jp.getSignature().getName();
        log.info("【返回增強】the method 【" + methodName + "】 ends with 【" + result + "】");
    }
    /**
     * 異常增強:目標方法發(fā)生異常的時候執(zhí)行,第二個參數(shù)表示補貨異常的類型
     *
     * @param jp
     * @param e
     */
    @AfterThrowing(value = "execution(* com.wuychn.springbootaspect.controller.*.*(..))", throwing = "e")
    public void afterThorwingMethod(JoinPoint jp, Exception e) {
        String methodName = jp.getSignature().getName();
        log.error("【異常增強】the method 【" + methodName + "】 occurs exception: ", e);
    }
    /**
     * 環(huán)繞增強:目標方法執(zhí)行前后分別執(zhí)行一些代碼,發(fā)生異常的時候執(zhí)行另外一些代碼
     *
     * @return
     */
/*    @Around(value = "execution(* com.wuychn.springbootaspect.controller.*.*(..))")
    public Object aroundMethod(ProceedingJoinPoint jp) {
        String methodName = jp.getSignature().getName();
        Object result = null;
        try {
            log.info("【環(huán)繞增強中的--->前置增強】:the method 【" + methodName + "】 begins with " + Arrays.asList(jp.getArgs()));
            //執(zhí)行目標方法
            result = jp.proceed();
            log.info("【環(huán)繞增強中的--->返回增強】:the method 【" + methodName + "】 ends with " + result);
        } catch (Throwable e) {
            result = "error";
            log.info("【環(huán)繞增強中的--->異常增強】:the method 【" + methodName + "】 occurs exception " + e);
        }
        log.info("【環(huán)繞增強中的--->后置增強】:-----------------end.----------------------");
        return result;
    }*/
}

三、Controller

package com.wuychn.springbootaspect.controller;
import com.wuychn.springbootaspect.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class TestController {
    @GetMapping("/doNormal")
    public String doNormal(String name, String age, User user) {
        log.info("【執(zhí)行方法】:doNormal");
        return "doNormal";
    }
    @GetMapping("/doWithException")
    public String doWithException(String name, String age, User user) {
        log.info("【執(zhí)行方法】:doWithException");
        int a = 1 / 0;
        return "doWithException";
    }
}

啟動程序,當訪問doNormal方法時,

日志輸出如下:

2019-05-13 14:36:20.931  INFO 12592 --- [nio-9379-exec-5] c.w.springbootaspect.aspect.LogAspect    : 【前置通知】the method 【doNormal】 begins with ["zhangsan","12",{"address":["chengdu","beijing"],"name":"zhangsan"}]
2019-05-13 14:36:20.932  INFO 12592 --- [nio-9379-exec-5] c.w.s.controller.TestController          : 【執(zhí)行方法】:doNormal
2019-05-13 14:36:20.932  INFO 12592 --- [nio-9379-exec-5] c.w.springbootaspect.aspect.LogAspect    : 【后置通知】this is a afterMethod advice...
2019-05-13 14:36:20.932  INFO 12592 --- [nio-9379-exec-5] c.w.springbootaspect.aspect.LogAspect    : 【返回通知】the method 【doNormal】 ends with 【doNormal】

當訪問doWithException方法時,

日志輸出如下:

2019-05-13 14:45:03.699  INFO 12592 --- [nio-9379-exec-8] c.w.springbootaspect.aspect.LogAspect    : 【前置通知】the method 【doWithException】 begins with ["zhangsan","12",{"address":["chengdu","beijing"],"name":"zhangsan"}]
2019-05-13 14:45:03.699  INFO 12592 --- [nio-9379-exec-8] c.w.s.controller.TestController          : 【執(zhí)行方法】:doWithException
2019-05-13 14:45:03.699  INFO 12592 --- [nio-9379-exec-8] c.w.springbootaspect.aspect.LogAspect    : 【后置通知】this is a afterMethod advice...
2019-05-13 14:45:03.704 ERROR 12592 --- [nio-9379-exec-8] c.w.springbootaspect.aspect.LogAspect    : 【異常通知】the method 【doWithException】 occurs exception: 
 
java.lang.ArithmeticException: / by zero

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot2零基礎(chǔ)到精通之數(shù)據(jù)與頁面響應(yīng)

    SpringBoot2零基礎(chǔ)到精通之數(shù)據(jù)與頁面響應(yīng)

    SpringBoot是一種整合Spring技術(shù)棧的方式(或者說是框架),同時也是簡化Spring的一種快速開發(fā)的腳手架
    2022-03-03
  • 詳解Java編程中protected修飾符與static修飾符的作用

    詳解Java編程中protected修飾符與static修飾符的作用

    這篇文章主要介紹了Java編程中protected關(guān)鍵字與static關(guān)鍵字的作用,是Java入門學習中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-01-01
  • SpringBoot錯誤處理機制以及自定義異常處理詳解

    SpringBoot錯誤處理機制以及自定義異常處理詳解

    這篇文章主要為大家詳細介紹了SpringBoot錯誤處理機制以及自定義異常處理,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • mybatisplus 多表關(guān)聯(lián)條件分頁查詢的實現(xiàn)

    mybatisplus 多表關(guān)聯(lián)條件分頁查詢的實現(xiàn)

    本文主要介紹了mybatisplus 多表關(guān)聯(lián)條件分頁查詢的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-01-01
  • 面試題:Java中如何停止線程的方法

    面試題:Java中如何停止線程的方法

    這篇文章主要介紹了Java中如何停止線程的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • Java Comparator比較器實例解析

    Java Comparator比較器實例解析

    這篇文章主要介紹了Java Comparator比較器實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • Java MeteoInfo解析與繪圖代碼教程詳解

    Java MeteoInfo解析與繪圖代碼教程詳解

    這篇文章主要介紹了Java MeteoInfo解析與繪圖代碼教程,對于后端導出圖片的話,就需要添加色階了,這一文很簡單,就涉及色階,名稱,網(wǎng)格刻度線,感興趣的朋友一起看看吧
    2021-10-10
  • SpringBoot2.x的依賴管理配置

    SpringBoot2.x的依賴管理配置

    這篇文章主要介紹了SpringBoot2.x的依賴管理配置,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • java 創(chuàng)建線程的幾種方式

    java 創(chuàng)建線程的幾種方式

    本文主要介紹了java中創(chuàng)建線程的幾種方式。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • Idea servlet映射方法優(yōu)缺點對比

    Idea servlet映射方法優(yōu)缺點對比

    這篇文章主要介紹了Idea servlet映射方法優(yōu)缺點對比,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11

最新評論