Springboot自定义注解打印方法入参1. 背景2. maven配置3. 自定义注解4. 配置AOP切面5. 使用自定义注解打印
1. 背景
在开发过程中需要对程序进行大量的日志打印,其中就包括对方法入参以及返回值的打印,如果每个方法的入参以及出参都手动打印日志,不仅会有大量重复代码,同时代码会比较丑陋,可读性降低,所以需要一个切面来帮助打印日志,这时候就需要我们自己去定义一个自定义注解来做这件事了。
2. maven配置
首先需要在maven的pom文件中配置依赖。
com.alibaba fastjson org.springframework.boot spring-boot-starter-aop org.slf4j slf4j-api
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@Componentpublic 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+name String 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. 使用自定义注解打印
自定义注解定义完成,可以在我们的方法上面来使用这个注解了,使用如下图
调用该方法时,就可以看到该注解所打印的日志了