91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springboot如何實現一個簡單的aop實例

發布時間:2021-11-15 09:08:17 來源:億速云 閱讀:158 作者:小新 欄目:開發技術

小編給大家分享一下springboot如何實現一個簡單的aop實例,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

簡介

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

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

ok廢話說完,進入正題,如何實現一個aop

要實現aop,首先你要知道你拿aop來干啥,我們今天就以記錄日志來說,因為這個最常用,一般對于重要的數據庫操作,我們需要記錄操作人、什么時間、做了什么,關于做了什么怎么實現我們后面細講(要想知道做了什么,肯定得知道是哪個方法、并且哪些參數,這些屬于進階操作,我們先簡單實現一個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...");
    }
}

關于注解

  • @Aspect:告訴spring這是一個切面;

  • @Component:將切面交由spring來管理;

  • @Pointcut:切入點,直白點就是指定你需要從哪個地方切入,再直白點就是你想增強的目標方法,這里需要了解下execution表達式,可以通過這里來指定你需要切入的方法,可以指定單個方法、整個類的所有方法、類的某些方法、整個包下所有類的所有方法等;

  • @Before:目標方法執行前需要做的事;

  • @After:目標方法執行后需要做的事

還有幾個常用注解:

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

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

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

執行時機:
切入目標方法時,先織入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包下的,所以該包下的所有類的所有方法都會被增強

先假設后驗證

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

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

springboot如何實現一個簡單的aop實例

控制臺

springboot如何實現一個簡單的aop實例

驗證成功~


一個最基礎的aop實現完畢,接下來搞點進階操作

獲取目標方法參數

再來個測試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~";
    }
}

springboot如何實現一個簡單的aop實例

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

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

獲取目標方法參數需要用到JoinPoint,經測試,在@Before和@After中均能獲取

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

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

測試

springboot如何實現一個簡單的aop實例

結果

springboot如何實現一個簡單的aop實例

獲取目標方法名

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

@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()返回的就是方法名

springboot如何實現一個簡單的aop實例
springboot如何實現一個簡單的aop實例
springboot如何實現一個簡單的aop實例

獲取目標方法返回值

這個就需要用到@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,需手動調用ProceedingJoinPoint.proceed才能執行目標方法,并且如果目標方法有返回值,需要手動return

訪問"/hi"

springboot如何實現一個簡單的aop實例

二、@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的話需要添加一個參數returning,用于接收返回值,且AfterReturning注解中的形參要和AfterReturningExecute中的一致,不然識別不到

訪問"/hi"

springboot如何實現一個簡單的aop實例

看完了這篇文章,相信你對“springboot如何實現一個簡單的aop實例”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

中山市| 图木舒克市| 同德县| 潢川县| 河池市| 蓬安县| 泰兴市| 江油市| 衢州市| 定安县| 横峰县| 白水县| 新绛县| 福鼎市| 宁国市| 祥云县| 彝良县| 都江堰市| 宣化县| 芜湖县| 宝山区| 枝江市| 安陆市| 宁远县| 三门县| 曲周县| 女性| 镇康县| 南乐县| 临江市| 北辰区| 常宁市| 桓仁| 徐闻县| 中西区| 天柱县| 长宁区| 祁东县| 绥江县| 平安县| 东乌珠穆沁旗|