> 文章列表 > Springboot自定义注解打印方法入参

Springboot自定义注解打印方法入参

Springboot自定义注解打印方法入参

文章目录

      • 1. 背景
      • 2. maven配置
      • 3. 自定义注解
      • 4. 配置AOP切面
      • 5. 使用自定义注解打印

1. 背景

在开发过程中需要对程序进行大量的日志打印,其中就包括对方法入参以及返回值的打印,如果每个方法的入参以及出参都手动打印日志,不仅会有大量重复代码,同时代码会比较丑陋,可读性降低,所以需要一个切面来帮助打印日志,这时候就需要我们自己去定义一个自定义注解来做这件事了。

2. maven配置

首先需要在maven的pom文件中配置依赖。

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId>
</dependency>

3. 自定义注解

依赖配置好后,需要我们自定义一个注解。

@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface LogProfiler {/* 方法英文名称,格式为:类名.方法名*/String key() default "";/* 方法中文名称,必填*/String name();/* 描述信息,非必填*/String description() default "";}

@Documented 将该自定义注解添加到 javadoc 文档中
@Target({ElementType.METHOD}) 该注解是作用在方法上的
@Retention(RetentionPolicy.RUNTIME) 作用时机为运行时

4. 配置AOP切面

定义好注解后,需要定义切面来解析该注解。

新建一个LogAspect

@Aspect
@Component
public class LogAspect {private static final Logger log = LoggerFactory.getLogger(LogAspect.class);
}

声明切面

@Pointcut("@annotation(com.demo.common.annotation.LogProfiler)")
public void pointcut() {
}

配置环绕通知

@Around("pointcut()")public Object execParamLogAspect(ProceedingJoinPoint joinPoint) throws Throwable {// 如果停用日志打印,则直接执行原有代码逻辑,跳过打印日志if (!enable) {return joinPoint.proceed();}// 如果启用日志分析,则获取方法上的注解信息,并打印方法入参出参Method method = this.getMethod(joinPoint);LogProfiler logProfiler = method.getAnnotation(LogProfiler.class);// 获取注解上的 key+nameString key = logProfiler.key();String name = logProfiler.name();String str = key + "-" + name;Object[] args = joinPoint.getArgs();// 打印入参this.printParam(str, args);// 执行原有方法逻辑Object result = joinPoint.proceed();// 打印出参this.printResult(str, result);return result;}private Method getMethod(JoinPoint jp) throws Exception {MethodSignature methodSignature = (MethodSignature) jp.getSignature();Method method = methodSignature.getMethod();return jp.getTarget().getClass().getDeclaredMethod(method.getName(), method.getParameterTypes());}/* 打印入参 @param key  方法名称* @param args 参数*/private void printParam(String key, Object[] args) {if (log.isInfoEnabled()) {log.info("{}方法入参为:{}", key, JSONObject.toJSONString(args));}}/* 打印出参 @param key    方法名称* @param result 方法返回值*/private void printResult(String key, Object result) {if (log.isInfoEnabled()) {log.info("{}方法出参为:{}", key, JSONObject.toJSONString(result));}}

其中enable为日志打印的全局开关,可以通过在application.yml中配置该属性来决定日志是否打印。默认值为true。

    @Value("${log.profiler.enable:true}")private Boolean enable;

5. 使用自定义注解打印

自定义注解定义完成,可以在我们的方法上面来使用这个注解了,使用如下图

Springboot自定义注解打印方法入参

调用该方法时,就可以看到该注解所打印的日志了

Springboot自定义注解打印方法入参