参考第四章 添加AOP支持,SpringBoot使用Aop略有不同
一、添加pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
二、编写AOP切面
package com.container.monitor;
import java.util.Arrays;
import javax.servlet.http.HttpServletRequest;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.alibaba.druid.support.json.JSONUtils;
@Aspect
@Component
public class ApiMonitor {
private static final Logger logger = LoggerFactory.getLogger(ApiMonitor.class);
ThreadLocal<Long> startTime = new ThreadLocal<Long>();
@Pointcut("execution(public * com.container..*.controller.*Controller.*(..))")
@Order(1)
public void controllerPoint() {}
@Before("controllerPoint()")
public void doBeforeControllerPoint(JoinPoint joinPoint) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
logger.info("<====================================================================");
logger.info("请求来源: => " + request.getRemoteAddr());
logger.info("请求URL: " + request.getRequestURL().toString());
logger.info("请求方式: " + request.getMethod());
logger.info("响应方法: " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
logger.info("请求参数 : " + Arrays.toString(joinPoint.getArgs()));
logger.info("---------------------------------------------------------------------");
startTime.set(System.currentTimeMillis());
}
@AfterReturning(pointcut="controllerPoint()", returning="rst")
public void doAfterControllerPoint(JoinPoint joinPoint, Object rst) {
logger.info("耗时(毫秒) : " + (System.currentTimeMillis() - startTime.get()));
logger.info("返回数据: {}", JSONUtils.toJSONString(rst));
logger.info("====================================================================>");
}
}