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

Springboot自定義注解&傳參&簡單應(yīng)用方式

 更新時間:2024年10月25日 09:24:23   作者:寫....寫個大西瓜  
SpringBoot框架中,通過自定義注解結(jié)合AOP可以實現(xiàn)功能如日志記錄與耗時統(tǒng)計,首先創(chuàng)建LogController和TimeConsuming注解,并為LogController定義參數(shù),然后,在目標(biāo)方法上應(yīng)用這些注解,最后,使用AspectJ的AOP功能,通過切點表達式定位這些注解

Springboot自定義注解&傳參&簡單應(yīng)用

1、目錄結(jié)構(gòu)

1.1 annotation為自定義注解位置

2、自定義注解

2.1 自定義兩個注解LogController、TimeConsuming用來記錄日志和統(tǒng)計方法耗時,其中LogController有三個參數(shù)

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogController {
    // 具體操作
    String description();

    // 日志級別
    int logLevel() default LogLevelConstant.INFO;

    // 日志進程/方法名
    String method();
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TimeConsuming {
}

3、注解使用

3.1 在需要記錄日志和統(tǒng)計方法耗時的方法上使用注解

 	@PostMapping("/createUser")
    @LogController(description = "創(chuàng)建用戶", method = "/createUser")
    @TimeConsuming
    public ResponseEntity<ResponseResultVO> createUser(@Valid @RequestBody SysUsersVo sysUsersVo) {
        log.info("UserManager = start create user [{}] pwd [{}]", sysUsersVo.getUserName(), sysUsersVo.getUserPwd());

        return ResponseEntity.ok(usersService.createUser(sysUsersVo).orElse(ResponseResultVO.builder()
                .code(ErrorCodeConstant.SYSTEM_ERROR)
                .msg(ErrorMsgConstant.SYSTEM_ERROR)
                .build()));
    }

4、使用Aspect實現(xiàn)功能

4.1 通過Aop以注解作為切點切入方法,實現(xiàn)業(yè)務(wù)功能

	@Pointcut("@annotation(com.pet.annotation.LogController)")
    public void annotationPoint() {
    }

    @Pointcut("@annotation(com.pet.annotation.TimeConsuming)")
    public void methodTimePoint() {
    }

4.2 取注解中參數(shù)

比如下面方法實現(xiàn)記錄日志功能

    @Before(value = "annotationPoint() && @annotation(logController)", argNames = "joinPoint, logController")
    public void beforeController(JoinPoint joinPoint, LogController logController) {
        HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
        HttpSession session = request.getSession();
        SysUsers user = (SysUsers) session.getAttribute(HttpConstant.SESSION_USER);
        String realMethodName = joinPoint.getSignature().getName();

        log.info("Aspect = [{}] ,user [{}] , method [{}] , logLevel [{}] , do [{}] , realMethod [{}]",
                new Date(), user == null ? "system" : user.getUserName(), logController.method(), logController.logLevel(), logController.description(), realMethodName);

        // 異步處理日志
        publisher.publishEvent(new LogToDbEvent(
                LogToDbEventEntity.builder()
                        .date(new Date())
                        .userName(user == null ? "system" : user.getUserName())
                        .method(logController.method())
                        .logLevel(logController.logLevel())
                        .description(logController.description())
                        .realMethod(realMethodName)
                        .build()));
    }

統(tǒng)計方法耗時方法

	@Around(value = "methodTimePoint()")
    public Object apiTimeConsuming(ProceedingJoinPoint pjp) throws Throwable {
        long begin = System.currentTimeMillis();
        String method = pjp.getSignature().getName();
        String className = pjp.getTarget().getClass().getName();

        Object ret = pjp.proceed();
        log.info("Aspect = [{}] ,class [{}] , method [{}] , time consuming[{}]", new Date(), className, method, System.currentTimeMillis() - begin);
        return ret;
    }

總結(jié)

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

相關(guān)文章

  • javaSE類和對象進階用法舉例詳解

    javaSE類和對象進階用法舉例詳解

    JavaSE的面向?qū)ο缶幊淌擒浖_發(fā)中的基石,它通過類和對象的概念,實現(xiàn)了代碼的模塊化、可復(fù)用性和靈活性,這篇文章主要介紹了javaSE類和對象進階用法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-08-08
  • IDEA打包應(yīng)用程序的教程圖解

    IDEA打包應(yīng)用程序的教程圖解

    這篇文章主要介紹了IDEA打包應(yīng)用程序的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 一文教你如何使用AES對接口參數(shù)進行加密

    一文教你如何使用AES對接口參數(shù)進行加密

    這篇文章主要是想為大家介紹一下如何使用AES實現(xiàn)對接口參數(shù)進行加密,文中的示例代碼簡潔易懂,具有一定的借鑒價值,需要的小伙伴可以了解一下
    2023-08-08
  • Java的validation參數(shù)校驗代碼實例

    Java的validation參數(shù)校驗代碼實例

    這篇文章主要介紹了Java的validation參數(shù)校驗代碼實例,Validation參數(shù)校驗是指在程序運行中對傳進來的參數(shù)進行合法性檢查,以保證程序的正確性和安全性,需要的朋友可以參考下
    2023-10-10
  • SpringBoot通過tractId操作日志鏈路跟蹤

    SpringBoot通過tractId操作日志鏈路跟蹤

    這篇文章給大家介紹SpringBoot通過tractId操作日志鏈路跟蹤,通過tractId,即可完成對從一個請求進入系統(tǒng)到請求結(jié)束的日志追蹤,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-10-10
  • Java四種拷貝方式實戰(zhàn)總結(jié)(一文掃清所有拷貝問題)

    Java四種拷貝方式實戰(zhàn)總結(jié)(一文掃清所有拷貝問題)

    在Java中文件拷貝可以通過多種方式實現(xiàn),不同方式的性能和適用場景有所差異,文中通過代碼介紹的非常詳細(xì),這篇文章主要介紹了Java四種拷貝方式的相關(guān)資料,需要的朋友可以參考下
    2025-07-07
  • 關(guān)于@Scheduled參數(shù)及cron表達式解釋

    關(guān)于@Scheduled參數(shù)及cron表達式解釋

    這篇文章主要介紹了關(guān)于@Scheduled參數(shù)及cron表達式解釋,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java中List與數(shù)組之間的相互轉(zhuǎn)換

    Java中List與數(shù)組之間的相互轉(zhuǎn)換

    在日常Java學(xué)習(xí)或項目開發(fā)中,經(jīng)常會遇到需要int[]數(shù)組和List列表相互轉(zhuǎn)換的場景,然而往往一時難以想到有哪些方法,最后可能會使用暴力逐個轉(zhuǎn)換法,往往不是我們所滿意的,下面這篇文章主要給大家介紹了關(guān)于Java中List與數(shù)組之間的相互轉(zhuǎn)換,需要的朋友可以參考下
    2023-05-05
  • 解決Spring?Security集成knife4j訪問接口文檔出現(xiàn)403的問題

    解決Spring?Security集成knife4j訪問接口文檔出現(xiàn)403的問題

    這篇文章主要給大家介紹了如何解決Spring?Security集成knife4j訪問接口文檔出現(xiàn)403的問題,文中有詳細(xì)的解決方案,有需要的朋友可以參考閱讀下
    2023-07-07
  • 關(guān)于SpringMVC在Controller層方法的參數(shù)解析詳解

    關(guān)于SpringMVC在Controller層方法的參數(shù)解析詳解

    在SpringMVC中,控制器Controller負(fù)責(zé)處理由DispatcherServlet分發(fā)的請求,下面這篇文章主要給大家介紹了關(guān)于SpringMVC在Controller層方法的參數(shù)解析的相關(guān)資料,需要的朋友可以參考下
    2021-12-12

最新評論

区。| 雷山县| 大名县| 隆化县| 张掖市| 广州市| 廊坊市| 苍山县| 田阳县| 吉木萨尔县| 铁岭市| 萍乡市| 仁布县| 金平| 花莲县| 锡林郭勒盟| 南岸区| 神池县| 宝清县| 连江县| 武穴市| 东至县| 巴南区| 宝兴县| 青田县| 许昌市| 吉安市| 东海县| 安顺市| 淮北市| 湟中县| 满洲里市| 赤峰市| 苍溪县| 体育| 阿拉善盟| 巩留县| 昌图县| 密云县| 全椒县| 乐平市|