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

Springboot如何正確使用AOP問題

 更新時間:2025年06月24日 16:13:50   作者:yololee_  
這篇文章主要介紹了Springboot如何正確使用AOP問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

?一、AOP概念

切面(Aspect)

  • 一個關(guān)注點的模塊化,這個關(guān)注點可能會橫切多個對象。
  • 事務(wù)管理是J2EE應(yīng)用中一個關(guān)于橫切關(guān)注點的很好的例子。
  • 在Spring AOP中,切面可以使用基于模式或者基于@Aspect注解的方式來實現(xiàn)

連接點(JoinPoint)

在程序執(zhí)行過程中某個特定的點,比如某方法調(diào)用的時候或者處理異常的時候。在SpringAOP中,一個連接點總是表示一個方法的執(zhí)行

通知(Advice)

  • 在切面的某個特定的連接點上執(zhí)行的動作。
  • 其中包括了Around、Before和After等不同類型的通知。
  • 許多AOP框架(包括Spring)都是以攔截器做通知模型,并維護一個以連接點為中心的攔截器鏈

切入點(PointCut)

  • 匹配連接點的斷言。
  • 通知和一個切入點表達(dá)式關(guān)聯(lián),并在滿足這個切入點的連接點上運行(例如,當(dāng)執(zhí)行某個特定名稱的方法時),切入點表達(dá)式如何和連接點匹配是AOP的核心:Spring缺省使用AspectJ切入點語法

引入(Intorduction)

  • 用來給一個類型聲明額外的方法或?qū)傩裕ㄒ脖环Q為連接類型聲明)。
  • Spring允許引入新的接口(以及一個對應(yīng)的實現(xiàn))到任何被代理的對象。
  • 例如,你可以使用引入來使一個bean實現(xiàn)接口,以便簡化緩存機制

目標(biāo)對象(Target Object)

  • 被一個或者多個切面所通知的對象。也被稱做被通知對象。
  • 既然Spring AOP是通過運行時代理實現(xiàn)的,這個對象永遠(yuǎn)是一個被代理對象

AOP代理(Aop proxy)

  • AOP框架創(chuàng)建的對象,用來實現(xiàn)切面契約(例如通知方法執(zhí)行等等)。
  • 在Spring中,AOP代理可以是JDK動態(tài)代理或者CGLIB代理

植入(weaving)

  • 把切面連接到其它的應(yīng)用程序類型或者對象上,并創(chuàng)建一個被通知的對象。
  • 這些可以在編譯時(例如使用AspectJ編譯器),類加載時和運行時完成。
  • Spring和其他純Java AOP框架一樣,在運行時完成織入

二、切點表達(dá)式?

execution表達(dá)式

用于匹配方法執(zhí)行的連接點,屬于方法級別

語法:

execution(修飾符 返回值類型 方法名(參數(shù))異常)

語法參數(shù)描述
修飾符可選,如public,protected,寫在返回值前,任意修飾符填*號就可以
返回值類型必選,可以使用*來代表任意返回值
方法名必選,可以用*來代表任意方法
參數(shù)()代表是沒有參數(shù),(..)代表是匹配任意數(shù)量,任意類型的參數(shù),當(dāng)然也可以指定類型的參數(shù)進(jìn)行匹配,如要接受一個String類型的參數(shù),則(java.lang.String), 任意數(shù)量的String類型參數(shù):(java.lang.String..)
異常可選,語法:throws 異常,異常是完整帶包名,可以是多個,用逗號分隔

符號:

符號描述
*匹配任意字符
匹配多個包或者多個參數(shù)
+表示類及其子類

條件符:

符號描述
&&、and
||
!

案例

攔截com.gj.web包下的所有子包里的任意類的任意方法

execution(* com.gj.web..*.*(..))

攔截com.gj.web.api.Test2Controller下的任意方法

execution(* com.gj.web.api.Test2Controller.*(..))

攔截任何修飾符為public的方法

execution(public * * (..))

攔截com.gj.web下的所有子包里的以ok開頭的方法

execution(* com.gj.web..*.ok*(..))

三、AOP通知

在切面類中需要定義切面方法用于響應(yīng)響應(yīng)的目標(biāo)方法,切面方法即為通知方法,通知方法需要用注解標(biāo)識,AspectJ支持5種類型的通知注解

注解描述
@Before前置通知, 在方法執(zhí)行之前執(zhí)行
@After后置通知, 在方法執(zhí)行之后執(zhí)行
@AfterReturn返回通知, 在方法返回結(jié)果之后執(zhí)行
@AfterThrowing異常通知, 在方法拋出異常之后
@Around環(huán)繞通知,圍繞方法的執(zhí)行

@Before

    @Before("testCut()")
    public void cutProcess(JoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        System.out.println("注解方式AOP開始攔截, 當(dāng)前攔截的方法名: " + method.getName());
    }

@After

    @After("testCut()")
    public void after(JoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        System.out.println("注解方式AOP執(zhí)行的方法 :"+method.getName()+" 執(zhí)行完了");
    }

@AfterReturn:其中value表示切點方法,returning表示返回的結(jié)果放到result這個變量中

    /**
     * returning屬性指定連接點方法返回的結(jié)果放置在result變量中
     * @param joinPoint 連接點
     * @param result 返回結(jié)果
     */
    @AfterReturning(value = "testCut()",returning = "result")
    public void afterReturn(JoinPoint joinPoint, Object result) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        System.out.println("注解方式AOP攔截的方法執(zhí)行成功, 進(jìn)入返回通知攔截, 方法名為: "+method.getName()+", 返回結(jié)果為: "+result.toString());
    }

@AfterThrowing:其中value表示切點方法,throwing表示異常放到e這個變量

    @AfterThrowing(value = "testCut()", throwing = "e")
    public void afterThrow(JoinPoint joinPoint, Exception e) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        System.out.println("注解方式AOP進(jìn)入方法異常攔截, 方法名為: " + method.getName() + ", 異常信息為: " + e.getMessage());
    }

@Around

    @Around("testCut()")
    public Object testCutAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("注解方式AOP攔截開始進(jìn)入環(huán)繞通知.......");
            Object proceed = joinPoint.proceed();
            System.out.println("準(zhǔn)備退出環(huán)繞......");
            return proceed;
    }

四、springboot中使用AOP

導(dǎo)出依賴

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

在這里插入圖片描述

自定義注解

package com.hl.springbootrunner.aop;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AOPAnnotations {
}

創(chuàng)建切面類

package com.hl.springbootrunner.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;


@Aspect
@Component
public class TestAspect {

    /**
     * 這里的路徑填自定義注解的全路徑
     */
    @Pointcut("@annotation(com.hl.springbootrunner.aop.AOPAnnotations)")
    public void testCut() {

    }

    @Before("testCut()")
    public void cutProcess(JoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        System.out.println("注解方式AOP開始攔截, 當(dāng)前攔截的方法名: " + method.getName());
    }

    @After("testCut()")
    public void after(JoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        System.out.println("注解方式AOP執(zhí)行的方法 :" + method.getName() + " 執(zhí)行完了");
    }


    @Around("testCut()")
    public Object testCutAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("注解方式AOP攔截開始進(jìn)入環(huán)繞通知.......");
        Object proceed = joinPoint.proceed();
        System.out.println("準(zhǔn)備退出環(huán)繞......");
        return proceed;
    }

    /**
     * returning屬性指定連接點方法返回的結(jié)果放置在result變量中
     *
     * @param joinPoint 連接點
     * @param result    返回結(jié)果
     */
    @AfterReturning(value = "testCut()", returning = "result")
    public void afterReturn(JoinPoint joinPoint, Object result) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        System.out.println("注解方式AOP攔截的方法執(zhí)行成功, 進(jìn)入返回通知攔截, 方法名為: " + method.getName() + ", 返回結(jié)果為: " + result.toString());
    }

    @AfterThrowing(value = "testCut()", throwing = "e")
    public void afterThrow(JoinPoint joinPoint, Exception e) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        System.out.println("注解方式AOP進(jìn)入方法異常攔截, 方法名為: " + method.getName() + ", 異常信息為: " + e.getMessage());
    }

}

自定義一個接口

@RestController
public class TestController {
 
    @GetMapping("/ok")
    @AOPAnnotations
    public String test2() {
        return "ok";
    }
 
}

測試

總結(jié)

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

相關(guān)文章

  • java實現(xiàn)角色及菜單權(quán)限的項目實踐

    java實現(xiàn)角色及菜單權(quán)限的項目實踐

    在Java中,實現(xiàn)角色及菜單權(quán)限管理涉及定義實體類、設(shè)計數(shù)據(jù)庫表、實現(xiàn)服務(wù)層和控制器層,這種管理方式有助于有效控制用戶權(quán)限,適用于企業(yè)級應(yīng)用,感興趣的可以一起來了解一下
    2024-09-09
  • Java實現(xiàn)二叉堆、大頂堆和小頂堆

    Java實現(xiàn)二叉堆、大頂堆和小頂堆

    二叉堆就是完全二叉樹,或者是靠近完全二叉樹結(jié)構(gòu)的二叉樹。大頂堆要求對于一個節(jié)點來說,它的左右節(jié)點都比它?。恍№敹岩髮τ谝粋€節(jié)點來說,它的左右節(jié)點都比它大。本文將用Java分別實現(xiàn)二叉堆、大頂堆和小頂堆。需要的可以參考一下
    2022-01-01
  • IntelliJ IDEA使用git初始化倉庫的使用方法

    IntelliJ IDEA使用git初始化倉庫的使用方法

    這篇文章主要介紹了IntelliJ IDEA使用git初始化倉庫的使用方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Spring @Bean注解的使用場景與案例實現(xiàn)

    Spring @Bean注解的使用場景與案例實現(xiàn)

    隨著SpringBoot的流行,我們現(xiàn)在更多采用基于注解式的配置從而替換掉了基于XML的配置,所以本篇文章我們主要探討基于注解的@Bean以及和其他注解的使用
    2023-03-03
  • Springboot maven plugin插件原理及作用

    Springboot maven plugin插件原理及作用

    這篇文章主要介紹了Springboot maven plugin插件原理及作用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • 利用Jackson解析JSON的詳細(xì)實現(xiàn)教程

    利用Jackson解析JSON的詳細(xì)實現(xiàn)教程

    JSON對于開發(fā)者并不陌生,如今的WEB服務(wù)等都是以JSON作為數(shù)據(jù)交換的格式。學(xué)習(xí)JSON格式的操作工具對開發(fā)者來說是必不可少的。本文將介紹如何使用Jackson開源工具庫對JSON進(jìn)行常見操作,需要的可以參考一下
    2022-07-07
  • Java實現(xiàn)定時器的4種方法超全總結(jié)

    Java實現(xiàn)定時器的4種方法超全總結(jié)

    對于一些特殊的代碼是需要定時執(zhí)行的,下面來看看定時器該如何編寫吧,下面這篇文章主要給大家介紹了關(guān)于Java實現(xiàn)定時器的4種方法,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • Java GZIP壓縮與解壓縮代碼實例

    Java GZIP壓縮與解壓縮代碼實例

    這篇文章主要介紹了Java GZIP壓縮與解壓縮代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • 基于Java實現(xiàn)Socket編程入門

    基于Java實現(xiàn)Socket編程入門

    Java最初是作為網(wǎng)絡(luò)編程語言出現(xiàn)的,使得客戶端和服務(wù)器的溝通變成了現(xiàn)實,而在網(wǎng)絡(luò)編程中,使用最多的就是Socket,本文就來介紹一下基于Java實現(xiàn)Socket編程入門,感興趣的可以來了解一下
    2022-03-03
  • Spring init-method與destroy-method屬性的用法解析

    Spring init-method與destroy-method屬性的用法解析

    這篇文章主要介紹了Spring init-method與destroy-method屬性的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評論

泗阳县| 饶平县| 乌拉特前旗| 英山县| 临漳县| 清涧县| 遂平县| 确山县| 神池县| 漳浦县| 辽宁省| 贺兰县| 麟游县| 沂水县| 应用必备| 孟村| 青岛市| 盐山县| 大关县| 墨竹工卡县| 界首市| 黔江区| 武宣县| 怀集县| 定结县| 平阴县| 昆山市| 新干县| 大荔县| 武冈市| 武平县| 弥勒县| 静海县| 建宁县| 化隆| 札达县| 四会市| 长阳| 扬州市| 安西县| 北流市|