spring aop 实现日志打印Demo
一.Demo项目框架图
二.Demo项目代码
1.AopLogDemoController
@RestController
@RequestMapping("/aopLog")
public class AopLogDemoController {
@Autowired
private IAopLogService aopLogService;
@GetMapping("/test")
public BaseResp testLog(BaseReq req){
BaseResp resp = aopLogService.testLog(req);
return resp;
}
}
2.IAopLogService
public interface IAopLogService{
BaseResp testLog(BaseReq req);
}
3.BaseReq
public class BaseReq {
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
4.BaseResp
public class BaseResp<T> {
private Integer code;
private String msg;
private T result;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getResult() {
return result;
}
public void setResult(T result) {
this.result = result;
}
}
5.TestResp
public class TestResp {
private Integer id;
private String name;
private String dept;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
}
6.AopLogServiceImpl
@Service
public class AopLogServiceImpl implements IAopLogService {
@Override
public BaseResp testLog(BaseReq req) {
BaseResp resp = new BaseResp();
TestResp testResp = new TestResp();
testResp.setId(req.getId());
testResp.setName("玛卡巴卡");
testResp.setDept("技术部");
resp.setResult(testResp);
resp.setCode(StatusCode.SUCCESS);
resp.setMsg("获取testLog数据成功");
return resp;
}
}
7.StatusCode
public class StatusCode {
public static final int SUCCESS = 0; //成功状态码
public static final int FAIL =1 ; //失败状态码
}
8.RequestAndResponseLog
@Aspect
@Component
public class RequestAndResponseLog {
private Logger logger = LoggerFactory.getLogger(RequestAndResponseLog.class);
/**
* 切入点 com.aop.log.controller包下的所有类和所有方法都会进行日志打印
*/
@Pointcut("execution(* com.aop.log.controller.*.*(..))")
public void controllerPointCut() {
}
/**
* 打印控制层请求参数
*/
@Before("controllerPointCut()")
public void logControllerParam(JoinPoint joinPoint) {
//获取方法、方法名
String className = joinPoint.getSignature().getDeclaringType().getSimpleName();
String methodName = joinPoint.getSignature().getName();
String method = className + "." + methodName;
//获取参数
Object[] args = joinPoint.getArgs();
//打印日志
logger.info("请求方法:{},请求参数:{}",method, JSONObject.toJSONString(args));
}
/**
* 打印控制层返回值
*/
@AfterReturning(pointcut = "controllerPointCut()", returning = "result")
public void doAfterReturning(JoinPoint joinPoint,BaseResp result) {
String className = joinPoint.getSignature().getDeclaringType().getSimpleName();
String methodName = joinPoint.getSignature().getName();
String method = className + "." + methodName;
logger.info("请求方法:{},返回值:{}",method,JSONObject.toJSONString(result));
}
}
9.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.aop</groupId>
<artifactId>log</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>log</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--springboot与aop集成jar包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.8</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
三.测试Demo项目
1.通过Postman发起请求:
2.控制台打印出请求参数和返回值日志
如有不对之处 敬请指正