SpringBoot日志注解與緩存優(yōu)化詳解
日志注解:
關(guān)于SpringBoot中的日志處理,在之前的文章中頁(yè)寫過(guò):
這次通過(guò)注解+Aop的方式來(lái)實(shí)現(xiàn)日志的輸出;
首先需要定義一個(gè)注解類:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAnnotation {
String module() default ""; //模塊名
String operation() default ""; //操作名
}
然后定義切點(diǎn):
//定義切點(diǎn)
@Pointcut("@annotation(com.xbhog.springbootvueblog.common.aop.LogAnnotation)")
public void logPointCut() {
}
白話文就是,注解所到之處都是切點(diǎn);比較專業(yè)的解釋的話可以自行百度或者Google;
有了切點(diǎn),那么我們需要實(shí)現(xiàn)通知事件,這里采用了環(huán)繞通知,也就是前后都會(huì)增強(qiáng)。
//環(huán)繞 處理流之前 和之后
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
long beginTime = System.currentTimeMillis();
//執(zhí)行方法
Object result = point.proceed();
//執(zhí)行時(shí)長(zhǎng)(毫秒)
long time = System.currentTimeMillis() - beginTime;
//保存日志
recordLog(point, time);
return result;
}
point.proceed()就是注解下所需要執(zhí)行的方法;類似于下面代碼段:
@LogAnnotation(module = "listArticle", operation = "顯示主頁(yè)展示數(shù)據(jù)")
public Result listArticle(@RequestBody PageParams pageParams) {
return articleService.listArticle(pageParams);
}
然后我們需要設(shè)置日志輸出的信息(recordLog),這里我們通過(guò)反射來(lái)獲得相應(yīng)的類名和方法名以及其他信息等。
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());
//請(qǐng)求的方法名
String className = joinPoint.getTarget().getClass().getName();
String methodName = signature.getName();
log.info("request method:{}",className + "." + methodName + "()");
//請(qǐng)求的參數(shù)
Object[] args = joinPoint.getArgs();
String params = JSON.toJSONString(args[0]);
log.info("params:{}",params);
//獲取request 設(shè)置IP地址
HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
log.info("ip:{}", IpUtils.getIpAddr(request));
log.info("excute time : {} ms",time);
log.info("=====================log end================================");
}
這樣切點(diǎn)和切面已經(jīng)完成了,使用的時(shí)候只需要在方法的上面直接加注解就可以獲得對(duì)應(yīng)的方法的日志信息,這樣在上線的時(shí)候遇到報(bào)錯(cuò)直接就可以定位到了。
緩存的優(yōu)化:
這個(gè)是在具體的項(xiàng)目中實(shí)現(xiàn)的,流程大體跟上面的實(shí)現(xiàn)類似,使用的也是注解實(shí)現(xiàn)的。
為什么需要使用緩存來(lái)提高網(wǎng)頁(yè)內(nèi)容的訪問(wèn)效率,因?yàn)閮?nèi)存的讀取比硬盤讀取的速度快的多的多,這樣對(duì)用戶的體驗(yàn)比較好,但是不是所有的數(shù)據(jù)都得放到緩存中,因?yàn)閮?nèi)存比磁盤貴的多,所以對(duì)哪些數(shù)據(jù)進(jìn)行緩存能使得用戶和服務(wù)器均衡也需要一定的經(jīng)驗(yàn)。
Cache注解:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Cache {
long expire() default 1 * 60 * 1000; //存活時(shí)間
String name() default ""; //緩存的名字
}
這里設(shè)置了數(shù)據(jù)的存活時(shí)間和名字,使得數(shù)據(jù)在一定的時(shí)間里可以在內(nèi)存中讀取數(shù)據(jù)。
接下來(lái)看下緩存的AOP實(shí)現(xiàn):
直接來(lái)看下環(huán)繞通知的處理流程:

根據(jù)圖示,首先獲取類名和調(diào)用的方法名,然后設(shè)置兩個(gè)數(shù)組,一個(gè)保存參數(shù)類型一個(gè)保存參數(shù)。
遍歷參數(shù),將其轉(zhuǎn)換成字符串,然后判斷字符串參數(shù)(params)為不為空,不為空的話,加密當(dāng)前字符串參數(shù),將當(dāng)前的加密的密碼保存到Redis中,每次進(jìn)入該切面的時(shí)候,需要判斷RedisValue是否為空,如果為空的話,那么需要執(zhí)行注解
下面的方法,如果不為空的話,直接從Redis中直接讀取數(shù)據(jù)顯示到前臺(tái)上。
通過(guò)日志Aop與緩存Aop的功能操作,實(shí)現(xiàn)效果如下:

總結(jié)
到此這篇關(guān)于SpringBoot日志注解與緩存優(yōu)化的文章就介紹到這了,更多相關(guān)SpringBoot日志注解與緩存優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)lucene搜索功能的方法(推薦)
下面小編就為大家?guī)?lái)一篇Java實(shí)現(xiàn)lucene搜索功能的方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
一篇文章教你如何用Java自定義一個(gè)參數(shù)校驗(yàn)器
這篇文章主要介紹了使用java自定義一個(gè)參數(shù)校驗(yàn)器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)2021-09-09
基于Jasypt對(duì)SpringBoot配置文件加密
這篇文章主要介紹了基于Jasypt對(duì)SpringBoot配置文件加密,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
Java中StringBuilder常用構(gòu)造方法解析
這篇文章主要介紹了Java中StringBuilder常用構(gòu)造方法解析,StringBuilder是一個(gè)可標(biāo)的字符串類,我們可以吧它看成是一個(gè)容器這里的可變指的是StringBuilder對(duì)象中的內(nèi)容是可變的,需要的朋友可以參考下2024-01-01
JAVA基礎(chǔ)類庫(kù)之String類,StringBuffer類和StringBuilder類
這篇文章主要介紹了Java中基礎(chǔ)類庫(kù)的String類,StringBuffer類和StringBuilder類,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2021-09-09
elasticsearch索引index數(shù)據(jù)功能源碼示例
這篇文章主要為大家介紹了elasticsearch索引index功能源碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
Java算法之最長(zhǎng)公共子序列問(wèn)題(LCS)實(shí)例分析
這篇文章主要介紹了Java算法之最長(zhǎng)公共子序列問(wèn)題(LCS),結(jié)合實(shí)例形式分析了最長(zhǎng)公共子序列的原理及問(wèn)題解決方法,需要的朋友可以參考下2017-11-11

