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的功能操作,實現效果如下:
結束:
如果你看到這里或者正好對你有所幫助,希望能點個👍或者⭐感謝;
有錯誤的地方,歡迎在評論指出,作者看到會進行修改。