SpringBoot日志注解與緩存優(yōu)化詳解
日志注解:
關(guān)于SpringBoot中的日志處理,在之前的文章中頁寫過:
這次通過注解+Aop的方式來實現(xiàn)日志的輸出;
首先需要定義一個注解類:
@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),那么我們需要實現(xiàn)通知事件,這里采用了環(huán)繞通知,也就是前后都會增強(qiáng)。
//環(huán)繞 處理流之前 和之后 @Around("logPointCut()") public Object around(ProceedingJoinPoint point) throws Throwable { long beginTime = System.currentTimeMillis(); //執(zhí)行方法 Object result = point.proceed(); //執(zhí)行時長(毫秒) long time = System.currentTimeMillis() - beginTime; //保存日志 recordLog(point, time); return result; }
point.proceed()就是注解下所需要執(zhí)行的方法;類似于下面代碼段:
@LogAnnotation(module = "listArticle", operation = "顯示主頁展示數(shù)據(jù)") public Result listArticle(@RequestBody PageParams pageParams) { return articleService.listArticle(pageParams); }
然后我們需要設(shè)置日志輸出的信息(recordLog),這里我們通過反射來獲得相應(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()); //請求的方法名 String className = joinPoint.getTarget().getClass().getName(); String methodName = signature.getName(); log.info("request method:{}",className + "." + methodName + "()"); //請求的參數(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)完成了,使用的時候只需要在方法的上面直接加注解就可以獲得對應(yīng)的方法的日志信息,這樣在上線的時候遇到報錯直接就可以定位到了。
緩存的優(yōu)化:
這個是在具體的項目中實現(xiàn)的,流程大體跟上面的實現(xiàn)類似,使用的也是注解實現(xiàn)的。
為什么需要使用緩存來提高網(wǎng)頁內(nèi)容的訪問效率,因為內(nèi)存的讀取比硬盤讀取的速度快的多的多,這樣對用戶的體驗比較好,但是不是所有的數(shù)據(jù)都得放到緩存中,因為內(nèi)存比磁盤貴的多,所以對哪些數(shù)據(jù)進(jìn)行緩存能使得用戶和服務(wù)器均衡也需要一定的經(jīng)驗。
Cache注解:
@Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Cache { long expire() default 1 * 60 * 1000; //存活時間 String name() default ""; //緩存的名字 }
這里設(shè)置了數(shù)據(jù)的存活時間和名字,使得數(shù)據(jù)在一定的時間里可以在內(nèi)存中讀取數(shù)據(jù)。
接下來看下緩存的AOP實現(xiàn):
直接來看下環(huán)繞通知的處理流程:
根據(jù)圖示,首先獲取類名和調(diào)用的方法名,然后設(shè)置兩個數(shù)組,一個保存參數(shù)類型一個保存參數(shù)。
遍歷參數(shù),將其轉(zhuǎn)換成字符串,然后判斷字符串參數(shù)(params)為不為空,不為空的話,加密當(dāng)前字符串參數(shù),將當(dāng)前的加密的密碼保存到Redis中,每次進(jìn)入該切面的時候,需要判斷RedisValue是否為空,如果為空的話,那么需要執(zhí)行注解
下面的方法,如果不為空的話,直接從Redis中直接讀取數(shù)據(jù)顯示到前臺上。
通過日志Aop與緩存Aop的功能操作,實現(xiàn)效果如下:
總結(jié)
到此這篇關(guān)于SpringBoot日志注解與緩存優(yōu)化的文章就介紹到這了,更多相關(guān)SpringBoot日志注解與緩存優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入學(xué)習(xí)java內(nèi)存化和函數(shù)式協(xié)同
這篇文章主要介紹了深入學(xué)習(xí)java內(nèi)存化和函數(shù)式協(xié)同,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,,需要的朋友可以參考下2019-06-06java集合之CopyOnWriteArrayList源碼解析
這篇文章主要介紹了java集合之CopyOnWriteArrayList源碼解析,容器array是volatile修飾的,即set和get方法都是線程安全的,整個添加過程上了鎖,所以整體是通過volatile和lock來保證的線程安全,需要的朋友可以參考下2023-12-12使用profiles進(jìn)行多環(huán)境配置的代碼實現(xiàn)
在項目開發(fā)的過程中會用到多個環(huán)境,為了便于開發(fā)使用,通常需要使用profiles進(jìn)行多環(huán)境配置,所以本文給大家介紹了使用profiles進(jìn)行多環(huán)境配置的代碼實現(xiàn),需要的朋友可以參考下2024-02-02SpringBoot加入Guava Cache實現(xiàn)本地緩存代碼實例
這篇文章主要介紹了SpringBoot加入Guava Cache實現(xiàn)本地緩存代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09