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

总结

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

相关文章

  • java swing GUI窗口美化方式

    java swing GUI窗口美化方式

    这篇文章主要介绍了java swing GUI窗口美化方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Java依赖注入容器超详细全面讲解

    Java依赖注入容器超详细全面讲解

    依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例
    2023-01-01
  • Java多线程异步调用性能调优方法详解

    Java多线程异步调用性能调优方法详解

    这篇文章主要为大家详细介绍了Java多线程异步调用性能调优,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Java判断一个时间是否在当前时间区间代码示例

    Java判断一个时间是否在当前时间区间代码示例

    这篇文章主要给大家介绍了关于使用Java判断一个时间是否在当前时间区间的相关资料,在日常开发中我们经常会涉及到时间的大小比较或者是判断某个时间是否在某个时间段内,需要的朋友可以参考下
    2023-07-07
  • maven继承父工程统一版本号的实现

    maven继承父工程统一版本号的实现

    这篇文章主要介绍了maven继承父工程统一版本号的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • MyBatis源码解析——获取SqlSessionFactory方式

    MyBatis源码解析——获取SqlSessionFactory方式

    这篇文章主要介绍了MyBatis源码解析——获取SqlSessionFactory方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 详解Java的JDBC API的存储过程与SQL转义语法的使用

    详解Java的JDBC API的存储过程与SQL转义语法的使用

    这篇文章主要介绍了详解Java的JDBC API的存储过程与SQL转义语法的使用,JDBC是Java用于连接使用各种数据库的API,需要的朋友可以参考下
    2015-12-12
  • 使用Spring Boot Mybatis 搞反向工程的步骤

    使用Spring Boot Mybatis 搞反向工程的步骤

    这篇文章主要介绍了使用Spring Boot Mybatis 搞反向工程的步骤,帮助大家更好的理解和使用spring boot框架,感兴趣的朋友可以了解下
    2021-01-01
  • 详述IntelliJ IDEA 中自动生成 serialVersionUID 的方法(图文)

    详述IntelliJ IDEA 中自动生成 serialVersionUID 的方法(图文)

    本篇文章主要介绍了详述IntelliJ IDEA 中自动生成 serialVersionUID 的方法(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-11-11
  • 利用maven deploy上传本地jar至私服的方法

    利用maven deploy上传本地jar至私服的方法

    这篇文章主要介绍了利用maven deploy上传本地jar至私服的方法,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-02-02

最新评论