• 使用Spring AOP实现系统操作日志记录


    使用Spring AOP实现系统操作日志记录

    一、什么是Spring

    Spring 是一个广泛应用的J2EE框架,是针对bean的生命周期进行管理的轻量级容器,主要由Spring Core、Spring AOP、Spring ORM、Spring DAO、Spring Context、Spring Web、Spring Web MVC七大模块组成。

    二、什么是AOP

    AOP是Aspect Oriented Programming的缩写,是面向切面编程,针对业务处理过程中的切面进行提取,降低了耦合度,提高了可重用性,经常用于日志记录、性能统计、安全控制、事务处理、异常处理等。AOP分为静态代理和动态代理,常见的AOP实现有AspectJ,Spring AOP,其中Aspect是属于静态代理,Spring AOP是动态代理,Spring AOP实现又是采用的JDK动态代理和CGLib动态代理两种方式。

    三、相关术语

    Aspect: 切面,在Spring中使用@Aspect注解标识,该类封装一些具体的操作,例如记录日志。

    Joinpoint: 连接点,是指的是在程序运行过程中的某个阶段。

    Pointcut: 切入点,定义的一个或者一组方法,当程序执行到这些切入点时,会产生通知。

    @Before: 前置通知,在连接点之前执行的通知,不能阻止连接点前的执行。

    @AfterReturning: 在连接点正常完成后执行的通知,不抛出异常的情况。

    @AfterThrowing: 和上方刚好补充,在连接点抛出异常是执行的通知。

    @After: 在连接点退出时执行的通知。异常退出和正常退出都会执行。

    @Around: 环绕通知,可以在方法前后加入自定义的操作,相当于环绕包围,并且可以决定方法是否执行。

    四、代码实现

    @Aspect
    @Component
    @Slf4j
    public class SysLogAspect {
    
        /**
         * Controller层切点,SysLog是自定义的注解
         */
        @Pointcut("@annotation(com.xxx.xxx.SysLog)")
        public void SysLogPointAspect() {
        }
    
    
        /**
         * @Description 环绕通知  用于拦截Controller层记录用户的操作
         */
        @Around("SysLogPointAspect()")
        public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
            //*========控制台输出=========*//
            log.info("==============访问请求==============\n");
          
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
           
            String requireType = request.getMethod();
            String requireUrl = request.getRequestURI();
    
            // 获取注解信息
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            Method method = signature.getMethod();
            SysLog syslog = method.getAnnotation(SysLog.class);
    
            //*========数据库日志=========*//
            // 保存日志到数据库.....
          
          	// 方法执行开始
            long beginTime = System.currentTimeMillis();
    
            //执行方法
            Object result = joinPoint.proceed();
    
            //执行时长(毫秒)
            long execTime = System.currentTimeMillis() - beginTime;
            return result;
        }
    }
    
    • 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
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    原文链接:https://monkey.blog.xpyvip.top/archives/shi-yong-springaop-shi-xian-xi-tong-cao-zuo-ri-zhi-ji-lu

  • 相关阅读:
    GPGGA NTRIP RTCM 笔记
    第二十章《Java Swing》第7节:对话框
    用商场媒体信息发布系统解决方案,让大家时刻关注你
    Go语言教程
    性价比较高的无线蓝牙耳机,300以内高音质蓝牙耳机推荐
    vue路由
    Flutter入门-与原生数据传递
    PhotoZoom 8全新版免费手机图片放大工具
    多因子组合优化:指数增强策略(附源码入口)
    用Abp实现双因素认证(Two-Factor Authentication, 2FA)登录(一):认证模块
  • 原文地址:https://blog.csdn.net/baidu_23966735/article/details/127417899