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

鼠扑  金牌会员 | 2022-10-25 22:23:56 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 578|帖子 578|积分 1734

使用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: 环绕通知,可以在方法前后加入自定义的操作,相当于环绕包围,并且可以决定方法是否执行。
四、代码实现
  1. @Aspect
  2. @Component
  3. @Slf4j
  4. public class SysLogAspect {
  5.     /**
  6.      * Controller层切点,SysLog是自定义的注解
  7.      */
  8.     @Pointcut("@annotation(com.xxx.xxx.SysLog)")
  9.     public void SysLogPointAspect() {
  10.     }
  11.     /**
  12.      * @Description 环绕通知  用于拦截Controller层记录用户的操作
  13.      */
  14.     @Around("SysLogPointAspect()")
  15.     public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
  16.         //*========控制台输出=========*//
  17.         log.info("==============访问请求==============\n");
  18.       
  19.         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  20.       
  21.         String requireType = request.getMethod();
  22.         String requireUrl = request.getRequestURI();
  23.         // 获取注解信息
  24.         MethodSignature signature = (MethodSignature) joinPoint.getSignature();
  25.         Method method = signature.getMethod();
  26.         SysLog syslog = method.getAnnotation(SysLog.class);
  27.         //*========数据库日志=========*//
  28.         // 保存日志到数据库.....
  29.       
  30.               // 方法执行开始
  31.         long beginTime = System.currentTimeMillis();
  32.         //执行方法
  33.         Object result = joinPoint.proceed();
  34.         //执行时长(毫秒)
  35.         long execTime = System.currentTimeMillis() - beginTime;
  36.         return result;
  37.     }
  38. }
复制代码
原文链接:https://monkey.blog.xpyvip.top/archives/shi-yong-springaop-shi-xian-xi-tong-cao-zuo-ri-zhi-ji-lu

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

鼠扑

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表