SpringBoot開發(fā)教程之AOP日志處理
日志處理:
需求分析
日志處理需要記錄的是:
- 請求的URL
- 訪問者IP
- 調(diào)用的方法
- 傳入的參數(shù)
- 返回的內(nèi)容
上面的內(nèi)容要求在控制臺和日志中輸出。
在學習這部分知識的時候,真的感覺收獲很多,在之前Spring學習的aop只是初步了解,現(xiàn)在有了一些深入的理解。好記性不如爛筆頭!
在日志處理這部分主要是aop的使用,通過切面的方式來整合到項目了,從而使得業(yè)務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效率。
人話:Aop 在不改變原有代碼的情況下 , 去增加新的功能
需要了解的:
- 橫切關注點:跨越應用程序多個模塊的方法或功能。即是,與我們業(yè)務邏輯無關的,但是我們需要關注的部分,就是橫切關注點。如日志 , 安全 , 緩存 , 事務等等 ....
- 切面(ASPECT):橫切關注點 被模塊化 的特殊對象。即,它是一個類。
- 通知(Advice):切面必須要完成的工作。即,它是類中的一個方法。
- 切入點(PointCut):切面通知 執(zhí)行的 “地點”的定義。
- 連接點(JointPoint):與切入點匹配的執(zhí)行點。
通知(Advice)里面還有幾種方法來幫助實現(xiàn),這里我列舉了該部分實現(xiàn)的方法:
- doBefore方法(方法前執(zhí)行),需要注解@Before實現(xiàn)
- After方法(方法后執(zhí)行),需要注解@After實現(xiàn)
- doAfterReturning方法,需要注解@AfterReturning實現(xiàn)
具體實現(xiàn)看后面部分。
重要部分:導入依賴
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<scope>test</scope>
</dependency>
提醒:導入包以后,刷新下Maven,如果運行的時候找不到包,重啟試試,網(wǎng)上有很多的解決方法(也試過),最后個人只是重啟一下子再刷新下maven就可以使用了。
這里就沒有給出解決方法,只是一個提醒。
實現(xiàn)過程:
創(chuàng)建一個類(LogAspect),將該類定義成一個切面(@Aspect)并且加入容器中(@Component)。
首先創(chuàng)建一個切入點,后面的Advice是建立在切入點上:
@Pointcut("execution(* com.blog.Controller..*.*(..))")
public void log(){}
整個表達式可以分為五個部分
1、execution():表達式主體。
2、第一個*號:表示返回類型,*號表示所有的類型。
3、包名:表示需要攔截的包名,后面的兩個句點分別表示當前包和當前包的所有子包,com.blog.Controller包、子孫包下所有類的方法。
4、第二個*號:表示類名,*號表示所有的類。
5、*(..) :第三個星號表示方法名,*號表示所有的方法,后面括弧里面表示方法的參數(shù),兩個句點表示任何參數(shù)
定義完切入點后,處理前置通知和后置通知:
@Before("log()")
public void doBefore(JoinPoint joinPoint){
System.out.println("在進入controller之前處理流-------------");
}
@After("log()")
public void doAfter(){
System.out.println("在進入controller之后處理流-------------");
}
//在切入點return內(nèi)容之后切入內(nèi)容(可以用來對處理返回值做一些加工處理)
@AfterReturning(returning = "result",pointcut="log()")
public void doAfterReturning(Object result){
logger.info("Return ------ {}",result );
}
通過上述的簡單介紹,可以知道我們?nèi)绻枰佬枨罄锩娴囊?,我們的重點應該放到前置通知里面,在流處理之前獲取前端操作的信息。
核心代碼如下:
//通過上下文來獲取請求里面的信息
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//獲取封裝了署名信息的對象,在該對象中可以獲取到目標方法名,所屬類的Class等信息(反射)
String classMethod = joinPoint.getSignature().getDeclaringTypeName()+","+joinPoint.getSignature().getName();
// 1. 獲取URL
String url = request.getRequestURL().toString();
//2. 獲取ip地址
String addr = request.getRemoteAddr();
/*創(chuàng)建一個類RequestData,來保存相關信息*/
RequestData requestData = new RequestData(
url, addr, classMethod, joinPoint.getArgs()
);
//在控制臺打印出來
logger.info("RequestData------{}",requestData);
創(chuàng)建的類是內(nèi)部類(RequestData),只是封裝一下需要打印的信息。
實驗效果:
在進入controller之前處理流-------------
2021-08-15 15:19:43.923 INFO 9644 --- [nio-8080-exec-1] com.blog.AspectAop.LogAspect : RequestData------RequestData{url='http://localhost:8080/', ipAddr='0:0:0:0:0:0:0:1', classMethod='com.blog.Controller.IndexController,index', args=[]}
2021-08-15 15:19:43.932 INFO 9644 --- [nio-8080-exec-1] com.blog.AspectAop.LogAspect : Return ------ index
在進入controller之后處理流-------------
參考文獻:
狂神說Spring
總結(jié)
到此這篇關于SpringBoot開發(fā)教程之AOP日志處理的文章就介紹到這了,更多相關SpringBoot AOP日志處理 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java Disruptor構(gòu)建高性能內(nèi)存隊列使用詳解
這篇文章主要為大家介紹了java Disruptor構(gòu)建高性能內(nèi)存隊列使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
java中MultipartFile和File最簡單的互相轉(zhuǎn)換示例
這篇文章主要給大家介紹了關于java中MultipartFile和File最簡單的互相轉(zhuǎn)換的相關資料,MultipartFile和File都是Java中用于處理文件上傳的類,MultipartFile用于處理上傳的文件,File用于處理本地磁盤上的文件,需要的朋友可以參考下2023-09-09
Idea跑的項目沒問題將程序install成jar包運行報錯空指針的問題
這篇文章主要介紹了Idea跑的項目沒問題,將程序install成jar包運行報錯空指針的問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
idea快捷鍵生成getter和setter,有構(gòu)造參數(shù),無構(gòu)造參數(shù),重寫toString方式
這篇文章主要介紹了java之idea快捷鍵生成getter和setter,有構(gòu)造參數(shù),無構(gòu)造參數(shù),重寫toString方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11

