SpringBoot日志注解与缓存优化详解

 更新时间:2021年10月17日 14:57:56   作者:xbhog  
这篇文章主要给大家介绍了关于SpringBoot日志注解与缓存优化的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

日志注解:

关于SpringBoot中的日志处理,在之前的文章中页写过:

点击进入

这次通过注解+Aop的方式来实现日志的输出;

首先需要定义一个注解类:

 @Target(ElementType.METHOD)
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 public @interface LogAnnotation {
     String module() default "";  //模块名
     String operation() default ""; //操作名
 }

然后定义切点:

 //定义切点
 @Pointcut("@annotation(com.xbhog.springbootvueblog.common.aop.LogAnnotation)")
 public void logPointCut() {
 }

白话文就是,注解所到之处都是切点;比较专业的解释的话可以自行百度或者Google;

有了切点,那么我们需要实现通知事件,这里采用了环绕通知,也就是前后都会增强。

 //环绕  处理流之前 和之后
 @Around("logPointCut()")
 public Object around(ProceedingJoinPoint point) throws Throwable {
     long beginTime = System.currentTimeMillis();
     //执行方法
     Object result = point.proceed();
     //执行时长(毫秒)
     long time = System.currentTimeMillis() - beginTime;
     //保存日志
     recordLog(point, time);
     return result;
 }

point.proceed()就是注解下所需要执行的方法;类似于下面代码段:

 @LogAnnotation(module = "listArticle", operation = "显示主页展示数据")
 public Result listArticle(@RequestBody PageParams pageParams) {
     return articleService.listArticle(pageParams);
 }

然后我们需要设置日志输出的信息(recordLog),这里我们通过反射来获得相应的类名和方法名以及其他信息等。

 private void recordLog(ProceedingJoinPoint joinPoint, long time) {
     MethodSignature signature = (MethodSignature) joinPoint.getSignature();
     Method method = signature.getMethod();
     LogAnnotation logAnnotation = method.getAnnotation(LogAnnotation.class);
     log.info("=====================log start================================");
     log.info("module:{}",logAnnotation.module());
     log.info("operation:{}",logAnnotation.operation());
 ​
     //请求的方法名
     String className = joinPoint.getTarget().getClass().getName();
     String methodName = signature.getName();
     log.info("request method:{}",className + "." + methodName + "()");
 ​
     //请求的参数
     Object[] args = joinPoint.getArgs();
     String params = JSON.toJSONString(args[0]);
     log.info("params:{}",params);
 ​
     //获取request 设置IP地址
     HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
     log.info("ip:{}", IpUtils.getIpAddr(request));
 ​
 ​
     log.info("excute time : {} ms",time);
     log.info("=====================log end================================");
 }

这样切点和切面已经完成了,使用的时候只需要在方法的上面直接加注解就可以获得对应的方法的日志信息,这样在上线的时候遇到报错直接就可以定位到了。

缓存的优化:

这个是在具体的项目中实现的,流程大体跟上面的实现类似,使用的也是注解实现的。

为什么需要使用缓存来提高网页内容的访问效率,因为内存的读取比硬盘读取的速度快的多的多,这样对用户的体验比较好,但是不是所有的数据都得放到缓存中,因为内存比磁盘贵的多,所以对哪些数据进行缓存能使得用户和服务器均衡也需要一定的经验。

Cache注解:

 @Target({ElementType.METHOD})
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 public @interface Cache {
     long expire() default 1 * 60 * 1000;  //存活时间
     String name() default "";  //缓存的名字
 }

这里设置了数据的存活时间和名字,使得数据在一定的时间里可以在内存中读取数据。

接下来看下缓存的AOP实现:

直接来看下环绕通知的处理流程:

根据图示,首先获取类名和调用的方法名,然后设置两个数组,一个保存参数类型一个保存参数。

遍历参数,将其转换成字符串,然后判断字符串参数(params)为不为空,不为空的话,加密当前字符串参数,将当前的加密的密码保存到Redis中,每次进入该切面的时候,需要判断RedisValue是否为空,如果为空的话,那么需要执行注解

下面的方法,如果不为空的话,直接从Redis中直接读取数据显示到前台上。

通过日志Aop与缓存Aop的功能操作,实现效果如下:

总结

到此这篇关于SpringBoot日志注解与缓存优化的文章就介绍到这了,更多相关SpringBoot日志注解与缓存优化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 宁可用Lombok也不把成员设置为public原理解析

    宁可用Lombok也不把成员设置为public原理解析

    这篇文章主要为大家介绍了宁可用Lombok也不把成员设置为public原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Java使用modbus4j实现modbus tcp通讯

    Java使用modbus4j实现modbus tcp通讯

    Modbus是由Modicon(现为施耐德电气公司的一个品牌)在1979年发明的,是全球第一个真正用于工业现场的总线协议,本文主要介绍了java如何使用modbus4j实现modbus tcp通讯,感兴趣的可以了解下
    2023-12-12
  • springboot通用分支处理超级管理员权限逻辑

    springboot通用分支处理超级管理员权限逻辑

    这篇文章主要为大家介绍了springboot通用分支处理超级管理员的权限逻辑,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • java基于Socket做一个简单下载器

    java基于Socket做一个简单下载器

    这篇文章主要为大家详细介绍了java如何基于Socket制作一个简单下载器,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Java中Volatile的作用实例解析

    Java中Volatile的作用实例解析

    本篇文章给大家通过实例分享了Java中Volatile的作用,有兴趣的朋友可以学习参考下。
    2018-07-07
  • EasyExcel实现读写Excel文件的示例代码

    EasyExcel实现读写Excel文件的示例代码

    EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。它可以在尽可能节约内存的情况下支持读写百M的Excel,所以本文就将利用它实现读写Excel文件,感兴趣的可以了解一下
    2022-08-08
  • Java利用Dijkstra算法求解拓扑关系最短路径

    Java利用Dijkstra算法求解拓扑关系最短路径

    迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学迪家迪杰斯特拉于1959年提出的,因此又叫狄克斯特拉算法。本文将利用迪克斯特拉(Dijkstra)算法求拓扑关系最短路径,感兴趣的可以了解一下
    2022-07-07
  • Java基础知识精通数组的内存分析

    Java基础知识精通数组的内存分析

    数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。Java 语言中提供的数组是用来存储固定大小的同类型元素
    2022-04-04
  • IDEA 中创建并部署 JavaWeb 程序的方法步骤(图文)

    IDEA 中创建并部署 JavaWeb 程序的方法步骤(图文)

    本文主要介绍了IDEA 中创建并部署 JavaWeb 程序的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 解析java中This的用法分析

    解析java中This的用法分析

    本篇文章是对java中This的用法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论