广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot日志注解与缓存优化详解
  • 888
分享到

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

2024-04-02 19:04:59 888人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录日志注解: 缓存的优化: 总结日志注解: 关于SpringBoot中的日志处理,在之前的文章中页写过: 点击进入 这次通过注解+aop的方式来实现日志的输出; 首先需要定义一

日志注解:

关于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日志注解与缓存优化内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringBoot日志注解与缓存优化详解

本文链接: https://www.lsjlt.com/news/154634.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作