首页>>后端>>SpringBoot->SpringBoot之日志注解和缓存优化

SpringBoot之日志注解和缓存优化

时间:2023-11-30 本站 点击:1

日志注解:

关于SpringBoot中的日志处理,在之前的文章中也写过:点击查看

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

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

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceLogAnnotation{Stringmodule()default"";//模块名Stringoperation()default"";//操作名}

然后定义切点:

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

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

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

//环绕处理流之前和之后@Around("logPointCut()")publicObjectaround(ProceedingJoinPointpoint)throwsThrowable{longbeginTime=System.currentTimeMillis();//执行方法Objectresult=point.proceed();//执行时长(毫秒)longtime=System.currentTimeMillis()-beginTime;//保存日志recordLog(point,time);returnresult;}

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

@LogAnnotation(module="listArticle",operation="显示主页展示数据")publicResultlistArticle(@RequestBodyPageParamspageParams){returnarticleService.listArticle(pageParams);}

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

privatevoidrecordLog(ProceedingJoinPointjoinPoint,longtime){MethodSignaturesignature=(MethodSignature)joinPoint.getSignature();Methodmethod=signature.getMethod();LogAnnotationlogAnnotation=method.getAnnotation(LogAnnotation.class);log.info("=====================logstart================================");log.info("module:{}",logAnnotation.module());log.info("operation:{}",logAnnotation.operation());//请求的方法名StringclassName=joinPoint.getTarget().getClass().getName();StringmethodName=signature.getName();log.info("requestmethod:{}",className+"."+methodName+"()");//请求的参数Object[]args=joinPoint.getArgs();Stringparams=JSON.toJSONString(args[0]);log.info("params:{}",params);//获取request设置IP地址HttpServletRequestrequest=HttpContextUtils.getHttpServletRequest();log.info("ip:{}",IpUtils.getIpAddr(request));log.info("excutetime:{}ms",time);log.info("=====================logend================================");}

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

缓存的优化:

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

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

Cache注解:

@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceCache{longexpire()default1*60*1000;//存活时间Stringname()default"";//缓存的名字}

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

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

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

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

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

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

结束

如果你看到这里或者正好对你有所帮助,希望能点个?或者⭐感谢;

有错误的地方,欢迎在评论指出,作者看到会进行修改。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/SpringBoot/2599.html