spring boot aop打印出入参配置(自定义注解)

DB操做出入参日志打印AOP配置web

 

背景:目前项目作中台建设,要求统一打印DB操做的出入参,并以json格式输出。spring

 

  1. 方案描述:

 

基于Spring Boot项目,经过自定义注解,使用AOP对自定义注解配置前置通知、后置通知对参数进行处理。日志处理使用slf4j处理,须要打印日志的类只需添加@Slf4j注解。@Profile({"dev", "test",prod})能够配置在配置切面的类上,这样能够选择在哪一个环境使用该切面配置。json

 

  1. 实施步骤:
  1. Spring项目添加maven依赖spring-boot-starter-aop注入AOP功能,添加gson依赖注入json输出功能。

<dependency>maven

        <groupId>org.springframework.boot</groupId>spring-boot

<artifactId>spring-boot-starter-aop</artifactId>google

</dependency>spa

<dependency>debug

    <groupId>com.google.code.gson</groupId>日志

    <artifactId>gson</artifactId>code

    <version>2.8.5</version>

</dependency>

 

  1. 自定义注解,以下定义

 

@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.METHOD})

@Documentedpublic @interface DBLog {

    String description() default "";

}

 

  1. 配置切面

 

c一、配置切点:建立DBLogAspect类,使用@Pointcut注解声明切点。如 下代码

@Pointcut(“DBLog ”)

Public void dbParameterLog(){

//empty

}

c二、定义@Around环绕通知,用于记录执行时间。以下代码

@Around("dbParameterLog()")

    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {

        long startTime = System.currentTimeMillis();

        Object ob = pjp.proceed();// ob 为方法的返回值

   logger.info("Response Args  : {}", new Gson().toJson(result));

        logger.info("耗时 : " + (System.currentTimeMillis() - startTime));

        return ob;

}

 

C三、定义@Before通知打印入参。代码以下

@Before("dbParameterLog()")

     public void doBefore(JoinPoint joinPoint) throws Throwable {

         ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

        HttpServletRequest request = attributes.getRequest();

   loggger.info("参数 : " + joinPoint.getArgs());

    }

 

C四、定义@AfterReturning通知打印出参。代码以下

 @AfterReturning(returning = "ret", pointcut = "dbParameterLog()")

     public void doAfterReturning(Object ret) throws Throwable {

         logger.debug("返回值 : " + JSON.toJSONString(ret));

     }

 

C五、定义@After通知打印方法内代码逻辑执行结束。代码以下

@After("webLog()")

     public void doAfter() throws Throwable {

         logger.info("======= End ============" + LINE_SEPARATOR);

     }

 

d、如何使用

DBLog 注解添加到CRUD的接口上就能够打印参数。

相关文章
相关标签/搜索