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

SpringBoot如何使用@Aspect注解實現AOP

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

使用@Aspect 注解實現AOP

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

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

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

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

相關注解介紹

注解作用
@Aspect把當前類標識為一個切面
@PointcutPointcut是織入Advice的觸發(fā)條件。每個Pointcut的定義包括2部分,一是表達式,二是方法簽名。方法簽名必須是public及void型??梢詫ointcut中的方法看作是一個被Advice引用的助記符,因為表達式不直觀,因此我們可以通過方法簽名的方式為此表達式命名。因此Pointcut中的方法只需要方法簽名,而不需要在方法體內編寫實際代碼。
@Around環(huán)繞增強,目標方法執(zhí)行前后分別執(zhí)行一些代碼
@AfterReturning返回增強,目標方法正常執(zhí)行完畢時執(zhí)行
@Before前置增強,目標方法執(zhí)行之前執(zhí)行
@AfterThrowing異常拋出增強,目標方法發(fā)生異常的時候執(zhí)行
@After后置增強,不管是拋出異常或者正常退出都會執(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包下面的所有方法的所有參數
    public void beforeMethod(JoinPoint jp) {
        String methodName = jp.getSignature().getName();
        log.info("【前置增強】the method 【" + methodName + "】 begins with " + JSON.toJSONString(jp.getArgs()));
    }
    /**
     * 后置增強:目標方法執(zhí)行之后執(zhí)行以下方法體的內容,不管是否發(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í)行,第二個參數表示補貨異常的類型
     *
     * @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

總結

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

相關文章

  • java實現protocol傳輸的客戶端和服務端的示例代碼

    java實現protocol傳輸的客戶端和服務端的示例代碼

    本文主要介紹了java實現protocol傳輸的客戶端和服務端的示例代碼,基于TCP協(xié)議的客戶端和服務端,包括了基本的連接、消息傳遞和關閉連接的操作,感興趣的可以了解一下
    2024-07-07
  • SpringBoot使用Mybatis注解實現分頁動態(tài)sql開發(fā)教程

    SpringBoot使用Mybatis注解實現分頁動態(tài)sql開發(fā)教程

    這篇文章主要為大家介紹了SpringBoot使用Mybatis注解實現分頁及動態(tài)sql開發(fā)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • Jenkin郵件收發(fā)實現原理及過程詳解

    Jenkin郵件收發(fā)實現原理及過程詳解

    這篇文章主要介紹了Jenkin郵件收發(fā)實現原理及過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • Java二叉樹的四種遍歷(遞歸與非遞歸)

    Java二叉樹的四種遍歷(遞歸與非遞歸)

    這篇文章小編給大家分享的是Java二叉樹的四種遍歷,主要是遞歸與非遞歸,下面文章加u來詳細介紹,感興趣的小伙伴一起來學習吧
    2021-10-10
  • 聊一聊Java的JVM類加載機制

    聊一聊Java的JVM類加載機制

    這篇文章主要介紹了聊一聊Java的JVM類加載機制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • nacos注冊中心調用服務失敗的解決方案

    nacos注冊中心調用服務失敗的解決方案

    nacos注冊中心出現調用服務失敗的情況,可能是因為注冊了兩個IP地址,一個是開發(fā)/測試環(huán)境,一個是本地啟動的IP,解決方法是將本地的IP從注冊中心下線,以避免干擾其他環(huán)境,確定哪個IP是開發(fā)環(huán)境/測試環(huán)境的IP,可以使用ifconfig命令查看服務器的IP地址
    2026-02-02
  • 淺談spring-kafka消費異常處理

    淺談spring-kafka消費異常處理

    本文主要介紹了spring-kafka消費異常處理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-09-09
  • spring boot(四)之thymeleaf使用詳解

    spring boot(四)之thymeleaf使用詳解

    Thymeleaf 是一個跟 Velocity、FreeMarker 類似的模板引擎,它可以完全替代 JSP 。接下來通過本文給大家介紹spring boot(四)之thymeleaf使用詳解,需要的朋友可以參考下
    2017-05-05
  • ES多條件查詢寫法舉例

    ES多條件查詢寫法舉例

    這篇文章主要給大家介紹了關于ES多條件查詢的相關資料,Elasticsearch多條件查詢是指在查詢數據時,可以同時使用多個條件來篩選數據,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • MyEclipse整合ssh三大框架環(huán)境搭載用戶注冊源碼下載

    MyEclipse整合ssh三大框架環(huán)境搭載用戶注冊源碼下載

    這篇文章主要為大家詳細介紹了如何使用MyEclipse整合ssh三大框架進行環(huán)境搭載,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10

最新評論

潞城市| 丹凤县| 准格尔旗| 中江县| 民乐县| 平潭县| 达拉特旗| 大石桥市| 常宁市| 上虞市| 紫云| 崇左市| 萨迦县| 新乡县| 罗源县| 东乡| 五家渠市| 来宾市| 新民市| 乌恰县| 三明市| 福泉市| 文成县| 屯昌县| 徐水县| 铁力市| 镇平县| 天气| 铁岭县| 衡山县| 剑阁县| 庆阳市| 南皮县| 阿鲁科尔沁旗| 汶上县| 荥经县| 洛扎县| 和林格尔县| 紫阳县| 高青县| 南漳县|