SpringBoot 使用AOP完成日志记载
SpringBoot 使用AOP完成日志记载
AOP是Spring的核心特性之一,另一个就是IoC了。
AOP就是面向切面编程,如果说类有实现的接口使用的就是JDK代理如果没有的话使用的就是Cglib代理。
之所以JDK的代理要通过实现接口而不是通过继承类,是因为JDK在生成代理类的时候会继承Proxy以表示这是一个生成的代理类,因为Java是单继承的,所以需要利用接口
-
AOP 领域中的特性术语:
- 通知(Advice): AOP 框架中的增强处理。通知描述了切面何时执行以及如何执行增强处理。
- 连接点(join point): 连接点表示应用执行过程中能够插入切面的一个点,这个点可以是方法的调用、异常的抛出。在 Spring AOP 中,连接点总是方法的调用。
- 切点(PointCut): 可以插入增强处理的连接点。
- 切面(Aspect): 切面是通知和切点的结合。
- 引入(Introduction):引入允许我们向现有的类添加新的方法或者属性。
- 织入(Weaving): 将增强处理添加到目标对象中,并创建一个被增强的对象,这个过程就是织入。
概念看起来总是有点懵,并且上述术语,不同的参考书籍上翻译还不一样,所以需要慢慢在应用中理解。
在SpringAOP中指定连接点的方式由很多,这里我用的是最常用的一种
创建一个类,在其上加上@Component(注入到IoC容器)@Aspect(声明是个切面类)然后创建一个表达式,然后通过这个表达式对方法进行切入。
/** * 使用AOP获取用户的操作信息(ip地址,操作对象等) * * @author lc * @date 2020-12-21 10:28 */ @Component @Aspect @Slf4j public class UserLog { @Pointcut("execution(* com.cliong.mall.controller..*.*(..))") public void log() { } @Before("log()") public void beforeAdvice(JoinPoint joinPoint) { log.info("前置通知"); // 接收到请求,记录请求内容 //RequestContextHolder:这个是request上下文持有者可以获取到一些请求的信息 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); assert attributes != null; //获取HttpServletRequest HttpServletRequest request = attributes.getRequest(); // 记录下请求内容 从HttpServletRequest读取 log.info("URL : " + request.getRequestURL().toString()); log.info("HTTP_METHOD : " + request.getMethod()); log.info("IP : " + request.getRemoteAddr()); log.info("port : " + request.getRemotePort()); log.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()); log.info("ARGS : " + Arrays.toString(joinPoint.getArgs())); } @After("log()") public void afterAdvice(JoinPoint joinPoint) { log.info("后置通知,处理完毕,准备返回"); } }
然后就是这样
本文来自博客园,作者:小鸡小鸡快点跑,转载请注明原文链接:https://www.cnblogs.com/clion/p/14189402.html

浙公网安备 33010602011771号