java入参为方法_Springboot自定义注解打印方法入参

7a9ec24141a86a264dabbddc5f198c2b.png

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. 使用自定义注解打印

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

a7b5a2fe1215c18b1641c97aad03f562.png

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

de119399d613f47b3056a003018ffad5.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值