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

基于springboot實現(xiàn)一個簡單的aop實例

 更新時間:2021年11月13日 14:33:15   作者:負債程序猿  
這篇文章主要介紹了基于springboot實現(xiàn)一個簡單的aop,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

簡介

AOP(Aspect-Oriented Programming:面向切面編程)

aop能將一些繁瑣、重復、無關(guān)業(yè)務的邏輯封裝起來,在一個地方進行統(tǒng)一處理,常用于日志記錄、事務管理、權(quán)限控制等,aop能在不改變原有代碼邏輯的基礎(chǔ)上對某個方法、某類方法、或者整個類進行無侵入式的加強,有效降低了代碼耦合度,并且提高了項目擴展性;

ok廢話說完,進入正題,如何實現(xiàn)一個aop

要實現(xiàn)aop,首先你要知道你拿aop來干啥,我們今天就以記錄日志來說,因為這個最常用,一般對于重要的數(shù)據(jù)庫操作,我們需要記錄操作人、什么時間、做了什么,關(guān)于做了什么怎么實現(xiàn)我們后面細講(要想知道做了什么,肯定得知道是哪個方法、并且哪些參數(shù),這些屬于進階操作,我們先簡單實現(xiàn)一個aop)

我們先new一個切面

@Aspect
@Component
public class LogAspect {

    @Pointcut("execution(* com.example.mydemos.controller..*(..))")
    public void controllerMenthod() {
    }

    @Before("controllerPointcut()")
    public void beforeExecute() {
        System.out.println("before...");
    }

    @After("controllerPointcut()")
    public void afterExecute() {
        System.out.println("after...");
    }
}

關(guān)于注解

  • @Aspect:告訴spring這是一個切面;
  • @Component:將切面交由spring來管理;
  • @Pointcut:切入點,直白點就是指定你需要從哪個地方切入,再直白點就是你想增強的目標方法,這里需要了解下execution表達式,可以通過這里來指定你需要切入的方法,可以指定單個方法、整個類的所有方法、類的某些方法、整個包下所有類的所有方法等;
  • @Before:目標方法執(zhí)行前需要做的事;
  • @After:目標方法執(zhí)行后需要做的事

還有幾個常用注解:

@Around(能自由的指定在目標方法執(zhí)行前后做增強邏輯,需要手動調(diào)用ProceedingJoinPoint的proceed方法來執(zhí)行目標方法,不調(diào)用則目標方法不會執(zhí)行,如果目標方法有返回值,還需手動返回)

@AfterReturning(在目標方法正常執(zhí)行完成后做增強,如果你需要獲取方法返回值就用它)

@AfterThrowing(當目標方法執(zhí)行過程中拋出異常時執(zhí)行)

執(zhí)行時機:
切入目標方法時,先織入Around,再織入Before,退出目標方法時,先織入Around,再織入AfterReturning,最后才織入After

來個測試controller
就是個平平無奇的普通controller

@RestController
public class HiController {

    @GetMapping("/hi")
    public String sayHello() {
        System.out.println("hi, good morning~");
        return "hi bro ~";
    }
}

我這個controller是放在Pointcut對應com.example.mydemos.controller包下的,所以該包下的所有類的所有方法都會被增強

先假設(shè)后驗證

按照上述demo
當我訪問"/hi"時,會先執(zhí)行@Before對應方法,輸出"before…",再執(zhí)行HiController 中的sayHello方法,輸出"hi, good morning~",并且返回"hi bro ~",最后執(zhí)行@After對應方法,輸出"after…"

驗證:
項目跑起來訪問"/hi"

在這里插入圖片描述

控制臺

在這里插入圖片描述

驗證成功~


一個最基礎(chǔ)的aop實現(xiàn)完畢,接下來搞點進階操作

獲取目標方法參數(shù)

再來個測試controller

@RestController
public class HelloController {
    
    @GetMapping("/hello/{title}/{content}")
    public String sayHello(@PathVariable("title") String title, @PathVariable("content") String content) {
        System.out.println(title + ":" + content);
        return "hello ya~";
    }
}

在這里插入圖片描述

現(xiàn)在我們有兩個controller,順便能測試下execution規(guī)則是否生效,我的規(guī)則是com.example.mydemos.controller下的所有方法都增強

HelloController的sayHello方法有兩個參數(shù)title和content,看我們能不能拿到

獲取目標方法參數(shù)需要用到JoinPoint,經(jīng)測試,在@Before和@After中均能獲取

    @Before("controllerPointcut()")
    public void beforeExecute(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        List<Object> list = Arrays.asList(args);
        System.out.println("before中的目標方法參數(shù)");
        list.forEach(System.out::println);
        System.out.println("before...");
    }

    @After("controllerPointcut()")
    public void afterExecute(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        List<Object> list = Arrays.asList(args);
        System.out.println("after中的目標方法參數(shù)");
        list.forEach(System.out::println);
        System.out.println("after...");
    }

joinPoint.getArgs()會返回一個object數(shù)組,這就是你的目標方法參數(shù)

測試

在這里插入圖片描述

結(jié)果

在這里插入圖片描述

獲取目標方法名

所有符合規(guī)則的方法都會被增強,那我怎么知道當前執(zhí)行的是哪個方法呢?

    @Before("controllerPointcut()")
    public void beforeExecute(JoinPoint joinPoint) {
        String name = joinPoint.getSignature().getName();
        System.out.println("before中的方法名:"+name);
        System.out.println("before...");
    }

    @After("controllerPointcut()")
    public void afterExecute(JoinPoint joinPoint) {
        String name = joinPoint.getSignature().getName();
        System.out.println("after中的方法名:"+name);
        System.out.println("after...");
    }

joinPoint.getSignature().getName()返回的就是方法名

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

獲取目標方法返回值

這個就需要用到@Around或者@AfterReturning

一、@Around

    @Around("controllerPointcut()")
    public Object aruondExecute(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("around before...");
        String name = joinPoint.getSignature().getName();
        Object o = joinPoint.proceed();
        System.out.println("方法" + name + "的返回值是" + o);
        System.out.println("around after...");
        return o;
    }

注意,如果用around,需手動調(diào)用ProceedingJoinPoint.proceed才能執(zhí)行目標方法,并且如果目標方法有返回值,需要手動return

訪問"/hi"

在這里插入圖片描述

二、@AfterReturning

    @AfterReturning(value = "controllerPointcut()", returning = "result")
    public void AfterReturningExecute(JoinPoint joinPoint, Object result) {
        System.out.println("AfterReturning...");
        String name = joinPoint.getSignature().getName();
        System.out.println("方法" + name + "的返回值是" + result);
    }

用AfterReturning的話需要添加一個參數(shù)returning,用于接收返回值,且AfterReturning注解中的形參要和AfterReturningExecute中的一致,不然識別不到

訪問"/hi"

在這里插入圖片描述


文中demo已上傳至gitee
順便求個star
么么嘰~

到此這篇關(guān)于基于springboot實現(xiàn)一個簡單的aop的文章就介紹到這了,更多相關(guān)springboot 實現(xiàn)aop內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java try-catch-finally異常處理機制詳解

    Java try-catch-finally異常處理機制詳解

    這篇文章主要介紹了Java try-catch-finally異常處理機制詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • java中不定長參數(shù)的實例用法

    java中不定長參數(shù)的實例用法

    在本篇文章里小編給大家分享的是關(guān)于java中不定長參數(shù)的使用方法以及相關(guān)代碼內(nèi)容,有興趣的朋友們可以學習參考下。
    2020-02-02
  • Java全排列算法字典序下的下一個排列講解

    Java全排列算法字典序下的下一個排列講解

    今天小編就為大家分享一篇關(guān)于Java全排列字典序下的下一個排列,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Spring容器初始化及問題解決方案

    Spring容器初始化及問題解決方案

    這篇文章主要介紹了Spring容器初始化及問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • JAVA基于Slack實現(xiàn)異常日志報警詳解

    JAVA基于Slack實現(xiàn)異常日志報警詳解

    這篇文章主要為大家介紹了JAVA基于Slack實現(xiàn)異常日志報警詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Java設(shè)計模式之Iterator模式介紹

    Java設(shè)計模式之Iterator模式介紹

    所謂Iterator模式,即是Iterator為不同的容器提供一個統(tǒng)一的訪問方式。本文以java中的容器為例,模擬Iterator的原理。需要的朋友可以參考下
    2013-07-07
  • mybatis?log4j2打印sql+日志實例代碼

    mybatis?log4j2打印sql+日志實例代碼

    在學習mybatis的時候,如果用log4j2來協(xié)助查看調(diào)試信息,則會大大提高學習的效率,加快debug速度,下面這篇文章主要給大家介紹了關(guān)于mybatis?log4j2打印sql+日志的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • Java不指定長度的二維數(shù)組實例

    Java不指定長度的二維數(shù)組實例

    今天小編就為大家分享一篇Java不指定長度的二維數(shù)組實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • java 中ThreadLocal本地線程和同步機制的比較

    java 中ThreadLocal本地線程和同步機制的比較

    這篇文章主要介紹了java 中ThreadLocal本地線程和同步機制的比較的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Java繪制迷宮動畫并顯示的示例代碼

    Java繪制迷宮動畫并顯示的示例代碼

    這篇文章主要為大家詳細介紹了如何利用Java語言實現(xiàn)繪制迷宮動畫并顯示,文中的示例代碼講解詳細,對我們學習Java有一定幫助,需要的可以參考一下
    2022-08-08

最新評論