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("后置通知,处理完毕,准备返回");
    
        }
    }
    

然后就是这样

posted @ 2020-12-25 16:03  小鸡小鸡快点跑  阅读(90)  评论(0)    收藏  举报