Springboot自定义注解&传参&简单应用方式

 更新时间:2024年10月25日 09:24:23   作者:写....写个大西瓜  
SpringBoot框架中,通过自定义注解结合AOP可以实现功能如日志记录与耗时统计,首先创建LogController和TimeConsuming注解,并为LogController定义参数,然后,在目标方法上应用这些注解,最后,使用AspectJ的AOP功能,通过切点表达式定位这些注解

Springboot自定义注解&传参&简单应用

1、目录结构

1.1 annotation为自定义注解位置

2、自定义注解

2.1 自定义两个注解LogController、TimeConsuming用来记录日志和统计方法耗时,其中LogController有三个参数

@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 在需要记录日志和统计方法耗时的方法上使用注解

 	@PostMapping("/createUser")
    @LogController(description = "创建用户", 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实现功能

4.1 通过Aop以注解作为切点切入方法,实现业务功能

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

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

4.2 取注解中参数

比如下面方法实现记录日志功能

    @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()));
    }

统计方法耗时方法

	@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;
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • javaSE类和对象进阶用法举例详解

    javaSE类和对象进阶用法举例详解

    JavaSE的面向对象编程是软件开发中的基石,它通过类和对象的概念,实现了代码的模块化、可复用性和灵活性,这篇文章主要介绍了javaSE类和对象进阶用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-08-08
  • IDEA打包应用程序的教程图解

    IDEA打包应用程序的教程图解

    这篇文章主要介绍了IDEA打包应用程序的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • 一文教你如何使用AES对接口参数进行加密

    一文教你如何使用AES对接口参数进行加密

    这篇文章主要是想为大家介绍一下如何使用AES实现对接口参数进行加密,文中的示例代码简洁易懂,具有一定的借鉴价值,需要的小伙伴可以了解一下
    2023-08-08
  • Java的validation参数校验代码实例

    Java的validation参数校验代码实例

    这篇文章主要介绍了Java的validation参数校验代码实例,Validation参数校验是指在程序运行中对传进来的参数进行合法性检查,以保证程序的正确性和安全性,需要的朋友可以参考下
    2023-10-10
  • SpringBoot通过tractId操作日志链路跟踪

    SpringBoot通过tractId操作日志链路跟踪

    这篇文章给大家介绍SpringBoot通过tractId操作日志链路跟踪,通过tractId,即可完成对从一个请求进入系统到请求结束的日志追踪,本文给大家介绍的非常详细,需要的朋友参考下吧
    2023-10-10
  • Java四种拷贝方式实战总结(一文扫清所有拷贝问题)

    Java四种拷贝方式实战总结(一文扫清所有拷贝问题)

    在Java中文件拷贝可以通过多种方式实现,不同方式的性能和适用场景有所差异,文中通过代码介绍的非常详细,这篇文章主要介绍了Java四种拷贝方式的相关资料,需要的朋友可以参考下
    2025-07-07
  • 关于@Scheduled参数及cron表达式解释

    关于@Scheduled参数及cron表达式解释

    这篇文章主要介绍了关于@Scheduled参数及cron表达式解释,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java中List与数组之间的相互转换

    Java中List与数组之间的相互转换

    在日常Java学习或项目开发中,经常会遇到需要int[]数组和List列表相互转换的场景,然而往往一时难以想到有哪些方法,最后可能会使用暴力逐个转换法,往往不是我们所满意的,下面这篇文章主要给大家介绍了关于Java中List与数组之间的相互转换,需要的朋友可以参考下
    2023-05-05
  • 解决Spring Security集成knife4j访问接口文档出现403的问题

    解决Spring Security集成knife4j访问接口文档出现403的问题

    这篇文章主要给大家介绍了如何解决Spring Security集成knife4j访问接口文档出现403的问题,文中有详细的解决方案,有需要的朋友可以参考阅读下
    2023-07-07
  • 关于SpringMVC在Controller层方法的参数解析详解

    关于SpringMVC在Controller层方法的参数解析详解

    在SpringMVC中,控制器Controller负责处理由DispatcherServlet分发的请求,下面这篇文章主要给大家介绍了关于SpringMVC在Controller层方法的参数解析的相关资料,需要的朋友可以参考下
    2021-12-12

最新评论