springbootaop打印出入参配置(自定义注解)
背景:目前项目做中台建设,要求统一打印DB操作的出入参,并以json格式输出。
- 方案描述:
基于Spring Boot项目,通过自定义注解,使用AOP对自定义注解配置前置通知、后置通知对参数进行处理。日志处理使用slf4j处理,需要打印日志的类只需添加@Slf4j注解。@Profile({"dev", "test",”prod”})可以配置在配置切面的类上,这样可以选择在哪个环境使用该切面配置。
- 实施步骤:
- Spring项目添加maven依赖spring-boot-starter-aop注入AOP功能,添加gson依赖注入json输出功能。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
- 自定义注解,如下定义
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documentedpublic @interface DBLog {
String description() default "";
}
- 配置切面
c1、配置切点:创建DBLogAspect类,使用@Pointcut注解声明切点。如下代码
@Pointcut(“DBLog ”)
Public void dbParameterLog(){
//empty
}
c2、定义@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;
}
C3、定义@Before通知打印入参。代码如下
@Before("dbParameterLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
loggger.info("参数 : " + joinPoint.getArgs());
}
C4、定义@AfterReturning通知打印出参。代码如下
@AfterReturning(returning = "ret", pointcut = "dbParameterLog()")
public void doAfterReturning(Object ret) throws Throwable {
logger.debug("返回值 : " + JSON.toJSONString(ret));
}
C5、定义@After通知打印方法内代码逻辑执行结束。代码如下
@After("webLog()")
public void doAfter() throws Throwable {
logger.info("======= End ============" + LINE_SEPARATOR);
}
d、如何使用
把DBLog 注解添加到CRUD的接口上就可以打印参数。
以上是 springbootaop打印出入参配置(自定义注解) 的全部内容, 来源链接: utcz.com/z/513760.html