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的接口上就能夠打印參數。

相關文章
相關標籤/搜索