0%

SpringBoot下实现AOP日志

Spring两大核心为IoC和AOP,本篇文章旨在记录下在SpringBoot下如何整合使用AOP,适用场景为Web项目中对请求做切面来记录日志。

引入依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
</dependencies>

本次项目使用的是SpringBoot 2.0.5,引入web和aop依赖。

实现一个Web请求

1
2
3
4
5
6
7
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(String name) {
return "Hello " + name;
}
}

实现切面和日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package cn.glieen.aop;

import org.aspectj.lang.JoinPoint;
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.stereotype.Component;

@Aspect
@Component
public class LogAop {
private final Logger logger = LoggerFactory.getLogger(LogAop.class);

@Pointcut("execution(* cn.glieen.controller.*.*(..))")
public void pointcut() {
}

@Before("pointcut()")
public void log(JoinPoint joinPoint) {
StringBuilder param = new StringBuilder();
Object[] args = joinPoint.getArgs();
for (Object arg : args) {
param.append(arg).append(" ");
}
logger.info("Args:" + param.toString());
logger.info("Method:" + joinPoint.getSignature().toLongString());
}
}

@Aspect定义为切面类

@Component将切面注入到Spring容器中

@Pointcut定义切入点

@Before前置通知,在执行目标方法之前执行切面方法

JoinPoint可以获得通知的签名信息

运行结果

使用Postman或者浏览器访问http://localhost:8080/hello?name=Glieen,的到以下运行结果:

1
2
3
4
5
6
INFO 10856 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
INFO 10856 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started
INFO 10856 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 7 ms
INFO 10856 --- [nio-8080-exec-1] cn.glieen.aop.LogAop : Args:Glieen
INFO 10856 --- [nio-8080-exec-1] cn.glieen.aop.LogAop : Method:public java.lang.String cn.glieen.controller.HelloController.hello(java.lang.String)

现在就可以使用AOP来记录方法的访问日志了。