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

基于springboot實(shí)現(xiàn)一個(gè)簡(jiǎn)單的aop實(shí)例

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

簡(jiǎn)介

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

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

ok廢話說(shuō)完,進(jìn)入正題,如何實(shí)現(xiàn)一個(gè)aop

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

我們先new一個(gè)切面

@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這是一個(gè)切面;
  • @Component:將切面交由spring來(lái)管理;
  • @Pointcut:切入點(diǎn),直白點(diǎn)就是指定你需要從哪個(gè)地方切入,再直白點(diǎn)就是你想增強(qiáng)的目標(biāo)方法,這里需要了解下execution表達(dá)式,可以通過(guò)這里來(lái)指定你需要切入的方法,可以指定單個(gè)方法、整個(gè)類的所有方法、類的某些方法、整個(gè)包下所有類的所有方法等;
  • @Before:目標(biāo)方法執(zhí)行前需要做的事;
  • @After:目標(biāo)方法執(zhí)行后需要做的事

還有幾個(gè)常用注解:

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

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

@AfterThrowing(當(dāng)目標(biāo)方法執(zhí)行過(guò)程中拋出異常時(shí)執(zhí)行)

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

來(lái)個(gè)測(cè)試controller
就是個(gè)平平無(wú)奇的普通controller

@RestController
public class HiController {

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

我這個(gè)controller是放在Pointcut對(duì)應(yīng)com.example.mydemos.controller包下的,所以該包下的所有類的所有方法都會(huì)被增強(qiáng)

先假設(shè)后驗(yàn)證

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

驗(yàn)證:
項(xiàng)目跑起來(lái)訪問(wèn)"/hi"

在這里插入圖片描述

控制臺(tái)

在這里插入圖片描述

驗(yàn)證成功~


一個(gè)最基礎(chǔ)的aop實(shí)現(xiàn)完畢,接下來(lái)搞點(diǎn)進(jìn)階操作

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

再來(lái)個(gè)測(cè)試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)在我們有兩個(gè)controller,順便能測(cè)試下execution規(guī)則是否生效,我的規(guī)則是com.example.mydemos.controller下的所有方法都增強(qiáng)

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

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

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

joinPoint.getArgs()會(huì)返回一個(gè)object數(shù)組,這就是你的目標(biāo)方法參數(shù)

測(cè)試

在這里插入圖片描述

結(jié)果

在這里插入圖片描述

獲取目標(biāo)方法名

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

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

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

獲取目標(biāo)方法返回值

這個(gè)就需要用到@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,需手動(dòng)調(diào)用ProceedingJoinPoint.proceed才能執(zhí)行目標(biāo)方法,并且如果目標(biāo)方法有返回值,需要手動(dòng)return

訪問(wèn)"/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的話需要添加一個(gè)參數(shù)returning,用于接收返回值,且AfterReturning注解中的形參要和AfterReturningExecute中的一致,不然識(shí)別不到

訪問(wèn)"/hi"

在這里插入圖片描述


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

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

相關(guān)文章

  • MyBatis Oracle 自增序列的實(shí)現(xiàn)方法

    MyBatis Oracle 自增序列的實(shí)現(xiàn)方法

    這篇文章給大家分享MyBatis Oracle 自增序列的實(shí)現(xiàn)方法及mybatis配置oracle的主鍵自增長(zhǎng)的方法,非常不錯(cuò)具有一定的參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-11-11
  • Java后臺(tái)防止客戶端重復(fù)請(qǐng)求、提交表單實(shí)現(xiàn)原理

    Java后臺(tái)防止客戶端重復(fù)請(qǐng)求、提交表單實(shí)現(xiàn)原理

    這篇文章主要介紹了Java后臺(tái)防止客戶端重復(fù)請(qǐng)求、提交表單實(shí)現(xiàn)原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • java實(shí)現(xiàn)簡(jiǎn)易聊天功能

    java實(shí)現(xiàn)簡(jiǎn)易聊天功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)易聊天功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • mybatis輸入映射和輸出映射實(shí)例詳解

    mybatis輸入映射和輸出映射實(shí)例詳解

    這篇文章主要介紹了mybatis輸入映射和輸出映射,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • java如何將可運(yùn)行jar打包成exe可執(zhí)行文件

    java如何將可運(yùn)行jar打包成exe可執(zhí)行文件

    Java程序完成以后,對(duì)于Windows操作系統(tǒng)習(xí)慣總是想雙擊某個(gè)exe文件就可以直接運(yùn)行程序,這篇文章主要給大家介紹了關(guān)于java如何將可運(yùn)行jar打包成exe可執(zhí)行文件的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • java實(shí)現(xiàn)圖片用Excel畫出來(lái)

    java實(shí)現(xiàn)圖片用Excel畫出來(lái)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)圖片用Excel畫出來(lái),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 一文詳解Java如何系統(tǒng)地避免空指針問(wèn)題

    一文詳解Java如何系統(tǒng)地避免空指針問(wèn)題

    新手Java開(kāi)發(fā)總是經(jīng)??罩羔槞z查,甚至某些老手也會(huì)犯這樣的問(wèn)題,所以這篇文章小編就帶大家一起來(lái)看看如何系統(tǒng)地避免空指針問(wèn)題,希望對(duì)大家有所幫助
    2024-01-01
  • Java/Android 實(shí)現(xiàn)簡(jiǎn)單的HTTP服務(wù)器

    Java/Android 實(shí)現(xiàn)簡(jiǎn)單的HTTP服務(wù)器

    這篇文章主要介紹了Java/Android 如何實(shí)現(xiàn)簡(jiǎn)單的HTTP服務(wù)器,幫助大家更好的進(jìn)行功能測(cè)試,感興趣的朋友可以了解下
    2020-10-10
  • Spring-Boot 集成Solr客戶端的詳細(xì)步驟

    Spring-Boot 集成Solr客戶端的詳細(xì)步驟

    本篇文章主要介紹了Spring-Boot 集成Solr客戶端的詳細(xì)步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • spring設(shè)置攔截器代碼實(shí)例

    spring設(shè)置攔截器代碼實(shí)例

    這篇文章主要介紹了spring設(shè)置攔截器代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論

莒南县| 武穴市| 奎屯市| 潞西市| 洛扎县| 准格尔旗| 班玛县| 永昌县| 沾益县| 乌兰浩特市| 靖安县| 康定县| 三都| 华池县| 西安市| 札达县| 徐汇区| 上思县| 静乐县| 连城县| 门源| 兰坪| 襄垣县| 芜湖市| 岑溪市| 新津县| 冕宁县| 龙州县| 五莲县| 泗水县| 临城县| 科尔| 闸北区| 轮台县| 诸城市| 仙居县| 七台河市| 海兴县| 个旧市| 手机| 仙居县|