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来记录方法的访问日志了。