中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

如何在SpringBoot中實現定位切點

發布時間:2021-06-09 16:24:11 來源:億速云 閱讀:228 作者:Leah 欄目:開發技術

今天就跟大家聊聊有關如何在SpringBoot中實現定位切點,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

execution 表達式

execution表達式的方式主要是在定義切點的時候,通過表達式的方式選取到所需要增強的方法。

execution表達式解讀

execution(<修飾符模式>?<返回類型模式><方法名模式>(<參數模式>)<異常模式>?)
類型解讀是否必須示例
<修飾符模式>表示所選的修飾符類型public/private/...
<返回類型模式>表示所選的返回值類型void/int/...
<方法名模式>表示所選的包或者方法com.luke.service/com.luke.controller.*/...
(<參數模式>)表示所選方法的參數*(..)/*(String name)/*(int size, ..)/...
<異常模式>表示所選方法的異常類型throws Exception/...
 // 匹配指定包中的所有方法
execution(* com.luke.service.*(..))

// 匹配當前包中的所有public方法
execution(public * UserService.*(..))

// 匹配指定包中的所有public方法,并且返回值是int類型的方法
execution(public int com.luke.service.*(..))

// 匹配指定包中的所有public方法,并且第一個參數是String,返回值是int類型的方法
execution(public int com.luke.service.*(String name, ..))

自定義切面類:

@Aspect
@Component
public class LogAspect {

    @Pointcut("execution(* com.luke.springdata.controller.*.*(..))")
    public void operationLog(){}

    /**
     * 這里只定義一個Around的增強做展示
     */
    @Around("operationLog()")
    public Object doAround(ProceedingJoinPoint joinPoint) {
        Object proceed = null;
        try {
            System.out.println("方法執行前");
            proceed = joinPoint.proceed();
            System.out.println("方法執行后");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return proceed;
    }
}

此切點的execution表達式為com.luke.springdata.controller包下的所有方法。
使用**@Around**注解表明增強的方法,并且指定切點。

測試用Controller類

@RestController
@RequestMapping("/person")
public class PersonController {

    @GetMapping("/test")
    public void test(){
        System.out.println("方法執行了");
    }
    
}

運行項目,調用該方法,查看結果。

方法執行前
方法執行了
方法執行后

自定義注解的方法

自定義注解的方式就是在需要增強的方法上面加上自定義的注解即可。

自定義注解類:

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

這里自定義了一個注解Log,該注解只能加在方法上。
自定義切面類:

@Aspect
@Component
public class LogAspect {

    @Pointcut("@annotation(com.luke.springdata.annotation.Log)")
    public void operationLog(){}

    /**
     * 這里只定義一個Around的增強做展示
     */
    @Around("operationLog()")
    public Object doAround(ProceedingJoinPoint joinPoint) {
        Object proceed = null;
        try {
            System.out.println("方法執行前");
            proceed = joinPoint.proceed();
            System.out.println("方法執行后");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return proceed;
    }
}

這里編寫的自定義個切面類,用**@Pointcut注解定義一個切面,并且這次采用@annotation(xxx)**的方式表明如果哪個方法上添加了xxx注解,則就使用該切面做增強。

同時在每個增強的方法上使用該切面,隨后編寫正常的方法增強邏輯即可。

測試用Controller類

@RestController
@RequestMapping("/person")
public class PersonController {

    @Log
    @GetMapping("/test")
    public void test(){
        System.out.println("方法執行了");
    }
    
}

此時在需要使用切面的方法上加入**@Log**注解,調用該方法,查看效果。

方法執行前
方法執行了
方法執行后

看完上述內容,你們對如何在SpringBoot中實現定位切點有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

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

AI

新巴尔虎右旗| 广河县| 北安市| 札达县| 江油市| 淅川县| 东至县| 元氏县| 佛坪县| 营口市| 静宁县| 黑龙江省| 民乐县| 安达市| 西畴县| 双峰县| 商都县| 泗水县| 香河县| 临高县| 监利县| 儋州市| 郧西县| 綦江县| 长武县| 靖边县| 内江市| 新丰县| 婺源县| 梨树县| 塔河县| 新闻| 辛集市| 仲巴县| 天峨县| 诸城市| 长岛县| 阿克陶县| 乐业县| 仪征市| 马龙县|