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

SpringBoot中配置AOP詳解

 更新時(shí)間:2024年01月08日 10:34:02   作者:探索er  
這篇文章主要介紹了SpringBoot中配置AOP詳解,Spring Boot 在Spring 的基礎(chǔ)上對AOP的配置提供了自動(dòng)化配置解決方案spring-boot-starter-aop,使開發(fā)者能夠更加便捷地在Spring Boot項(xiàng)目中使用AOP,需要的朋友可以參考下

配置AOP

1. AOP簡介

要介紹面向切面編程(Aspect-Oriented Programming,AOP) ,需要首先考慮這樣一個(gè)場景:公司有一個(gè)人力資源管理系統(tǒng)目前已經(jīng)上線,但是系統(tǒng)運(yùn)行不穩(wěn)定,有時(shí)運(yùn)行得很慢,為了檢測出到底是哪個(gè)環(huán)節(jié)出問題了,開發(fā)人員想要監(jiān)控每一個(gè)方法的執(zhí)行時(shí)間,再根據(jù)這些執(zhí)行時(shí)間判斷出問題所在。當(dāng)問題解決后,再把這些監(jiān)控移除掉。系統(tǒng)目前已經(jīng)運(yùn)行,如果手動(dòng)修改系統(tǒng)中成千上萬個(gè)方法,那么工作量未免太大,而且這些監(jiān)控方法以后還要移除掉;如果能夠在系統(tǒng)運(yùn)行過程中動(dòng)態(tài)添加代碼,就能很好地解決這個(gè)需求。這種在系統(tǒng)運(yùn)行時(shí)動(dòng)態(tài)添加代碼的方式稱為面向切面編程(AOP)。Spring框架對AOP提供了很好的支持。在AOP中,有一些常見的概念需要讀者了解。

  • Joinpoint (連接點(diǎn)):類里面可以被增強(qiáng)的方法即為連接點(diǎn)。例如,想修改哪個(gè)方法的功能,那么該方法就是一個(gè)連接點(diǎn)。
  • Pointcut(切入點(diǎn)):對Joinpoint進(jìn)行攔截的定義即為切入點(diǎn)。例如,攔截所有以insert 開始的方法,這個(gè)定義即為切入點(diǎn)。
  • Advice (通知):攔截到Joinpoint 之后所要做的事情就是通知。例如,上文說到的打印日志監(jiān)控。通知分為前置通知、后置通知、異常通知、最終通知和環(huán)繞通知。
  • Aspect ( 切面): Pointcut 和Advice的結(jié)合。
  • Target (目標(biāo)對象):要增強(qiáng)的類稱為Target。

2. Spring Boot支持

Spring Boot 在Spring 的基礎(chǔ)上對AOP的配置提供了自動(dòng)化配置解決方案spring-boot-starter-aop,使開發(fā)者能夠更加便捷地在Spring Boot項(xiàng)目中使用AOP。配置步驟如下。

首先在Spring Boot Web項(xiàng)目中引入spring- boot-starter-aop依賴,代碼如下:

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

然后在org.sang.aop.service包下創(chuàng)建UserService類,代碼如下:

@Service
public class UserService {
    public String getUserById(Integer id){
        System.out.println("get...");
        return "user";
    }
    public void deleteUserById(Integer id){
        System.out.println("delete...");
    }
}

接下來創(chuàng)建切面,代碼如下:

@Component
@Aspect
public class LogAspect {
    @Pointcut("execution(* com.example.*.*(..))")
    public void pc1() {
    }
    @Before(value = "pc1()")
    public void before(JoinPoint jp) {
        String name = jp.getSignature().getName();
        System.out.println(name + "方法開始執(zhí)行...");
    }
    @After(value = "pc1()")
    public void after(JoinPoint jp) {
        String name = jp.getSignature().getName();
        System.out.println(name + "方法執(zhí)行結(jié)束...");
    }
    @AfterReturning(value = "pc1()", returning = "result")
    public void afterReturning(JoinPoint jp, Object result) {
        String name = jp.getSignature().getName();
        System.out.println(name + "方法返回值為: " + result);
    }
    @AfterThrowing(value = "pc1 ()", throwing = "e")
    public void afterThrowing(JoinPoint jp, Exception e) {
        String name = jp.getSignature().getName();
        System.out.println(name + "方法拋異常了,異常是: " + e.getMessage());
    }
    @Around("pc1()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        return pjp.proceed();
    }
}

代碼解釋:

  • @Aspect注解表明這是一個(gè)切面類。
  • 第4~6行定義的pcl方法使用了@Pointcut注解,這是一個(gè)切入點(diǎn)定義。execution 中的第一個(gè) * 表示方法返回任意值,第二個(gè) * 表示service 包下的任意類,第三個(gè) * 表示類中的任意方法,括號(hào)中的兩個(gè)點(diǎn)表示方法參數(shù)任意,即這里描述的切入點(diǎn)為service 包下所有類中的所有方法。
  • 第 8~12行定義的方法使用了@Before注解,表示這是一個(gè)前置通知,該方法在目標(biāo)方法執(zhí)行之前執(zhí)行。通過JoinPoint參數(shù)可以獲取目標(biāo)方法的方法名、修飾符等信息。
  • 第14~18行定義的方法使用了@After注解,表示這是一個(gè)后置通知,該方法在目標(biāo)方法執(zhí)行之后執(zhí)行。
  • 第 20~24行定義的方法使用了@AfterReturning注解,表示這是一個(gè)返回通知,在該方法中可以獲取目標(biāo)方法的返回值。@AfterReturmning 注解的returning參數(shù)是指返回值的變量名,對應(yīng)方法的參數(shù)。注意,在方法參數(shù)中定義了result 的類型為Object,表示目標(biāo)方法的返回值可以是任意類型,若result 參數(shù)的類型為Long,則該方法只能處理目標(biāo)方法返回值為Long的情況。
  • 第26~30行定義的方法使用了@AfterThrowing注解,表示這是一個(gè)異常通知,即當(dāng)目標(biāo)方法發(fā)生異常時(shí),該方法會(huì)被調(diào)用,異常類型為Exception 表示所有的異常都會(huì)進(jìn)入該方法中執(zhí)行,若異常類型為ArithmeticException,則表示只有目標(biāo)方法拋出的ArithmeticException異常才會(huì)進(jìn)入該方法中處理。
  • 第32~35行定義的方法使用了@Around注解,表示這是一一個(gè)環(huán)繞通知。環(huán)繞通知是所有通知里功能最為強(qiáng)大的通知,可以實(shí)現(xiàn)前置通知、后置通知、異常通知以及返回通知的功能。目標(biāo)方法進(jìn)入環(huán)繞通知后,通過調(diào)用ProceedingJoinPoint對象的proceed方法使目標(biāo)方法繼續(xù)執(zhí)行,開發(fā)者可以在此修改目標(biāo)方法的執(zhí)行參數(shù)、返回值等,并且可以在此處理目標(biāo)方法的異常。

配置完成后,接下來在Controller 中創(chuàng)建接口,分別調(diào)用UserService中的兩個(gè)方法,即可看到LogAspect中的代碼動(dòng)態(tài)地嵌入目標(biāo)方法中執(zhí)行了。UserController 類的定義如下:

@RestController
public class UserController {
    @Autowired
    UserService userService;

    @GetMapping("/getUserById")
    public String getUserById(Integer id) {
        return userService.getUserById(id);
    }

    @GetMapping("/deleteUserById")
    public void deleteUserById(Integer id) {
        userService.deleteUserById(id);
    }
}

當(dāng)訪問/getUserById 接口時(shí),打印日志

getUserById方法開始執(zhí)行...
get...
getUserById方法返回值為: user
getUserById方法執(zhí)行結(jié)束...

到此這篇關(guān)于SpringBoot中配置AOP詳解的文章就介紹到這了,更多相關(guān)SpringBoot配置AOP內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringCloud Gateway自定義filter獲取body中的數(shù)據(jù)為空的問題

    SpringCloud Gateway自定義filter獲取body中的數(shù)據(jù)為空的問題

    這篇文章主要介紹了SpringCloud Gateway自定義filter獲取body中的數(shù)據(jù)為空,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java解析xml的四種方法匯總

    Java解析xml的四種方法匯總

    XML在不同的語言里解析方式都是一樣的,只不過實(shí)現(xiàn)的語法不同而已。java中基本的解析方式有四種,DOM解析、sax解析、JDOM解析和DOM4J解析,下面我們就來詳細(xì)探討下這四種方式
    2016-05-05
  • Java ConcurrentHashMap用法案例詳解

    Java ConcurrentHashMap用法案例詳解

    這篇文章主要介紹了Java ConcurrentHashMap用法案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 三道java新手入門面試題,通往自由的道路--JVM

    三道java新手入門面試題,通往自由的道路--JVM

    這篇文章主要為大家分享了最有價(jià)值的3道JVM面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,對hashCode方法的設(shè)計(jì)、垃圾收集的堆和代進(jìn)行剖析,感興趣的小伙伴們可以參考一下
    2021-07-07
  • SpringBoot基于沙箱環(huán)境實(shí)現(xiàn)支付寶支付教程

    SpringBoot基于沙箱環(huán)境實(shí)現(xiàn)支付寶支付教程

    本文介紹了如何使用支付寶沙箱環(huán)境進(jìn)行開發(fā)測試,包括沙箱環(huán)境的介紹、準(zhǔn)備步驟、在Spring Boot項(xiàng)目中結(jié)合支付寶沙箱進(jìn)行支付接口的實(shí)現(xiàn)與測試
    2025-03-03
  • Java實(shí)現(xiàn)Word文檔導(dǎo)出功能的完整指南

    Java實(shí)現(xiàn)Word文檔導(dǎo)出功能的完整指南

    在企業(yè)級(jí)應(yīng)用中,Java導(dǎo)出Word文檔是一項(xiàng)常見任務(wù),適用于報(bào)告生成和數(shù)據(jù)導(dǎo)出等場景,本文將介紹如何使用FreeMarker模板引擎實(shí)現(xiàn)該功能,有需要的小伙伴可以了解下
    2026-05-05
  • 使用maven編譯Java項(xiàng)目實(shí)例

    使用maven編譯Java項(xiàng)目實(shí)例

    這篇文章主要介紹了使用maven編譯Java項(xiàng)目實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • 在springboot中對kafka進(jìn)行讀寫的示例代碼

    在springboot中對kafka進(jìn)行讀寫的示例代碼

    本篇文章主要介紹了在springboot中對kafka進(jìn)行讀寫的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • SpringBoot中配置文件的加載順序解讀

    SpringBoot中配置文件的加載順序解讀

    這篇文章主要介紹了SpringBoot中配置文件的加載順序,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Spring Boot 2.4新特性減少95%內(nèi)存占用問題

    Spring Boot 2.4新特性減少95%內(nèi)存占用問題

    這篇文章主要介紹了Spring Boot 2.4新特性減少95%內(nèi)存占用問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評(píng)論

永顺县| 那曲县| 资中县| 花垣县| 南溪县| 临武县| 民权县| 繁昌县| 海伦市| 平谷区| 莎车县| 鹤山市| 周口市| 乌审旗| 六枝特区| 镇安县| 澄迈县| 蛟河市| 阿克苏市| 衡南县| 和林格尔县| 华坪县| 休宁县| 民丰县| 长治县| 陆丰市| 合水县| 高淳县| 丰顺县| 稻城县| 肃北| 祁门县| 丘北县| 通辽市| 揭西县| 和硕县| 威宁| 二连浩特市| 左贡县| 本溪| 衡阳县|