欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot開發(fā)教程之AOP日志處理

 更新時間:2021年10月17日 10:16:32   作者:xbhog  
現(xiàn)在凡是企業(yè)級的或者稍微大點(diǎn)項目,基本都需要日志管理,下面這篇文章主要給大家介紹了關(guān)于SpringBoot開發(fā)教程之AOP日志處理 的相關(guān)資料,需要的朋友可以參考下

日志處理:

需求分析

日志處理需要記錄的是:

  1. 請求的URL
  2. 訪問者IP
  3. 調(diào)用的方法
  4. 傳入的參數(shù)
  5. 返回的內(nèi)容

上面的內(nèi)容要求在控制臺和日志中輸出。

在學(xué)習(xí)這部分知識的時候,真的感覺收獲很多,在之前Spring學(xué)習(xí)的aop只是初步了解,現(xiàn)在有了一些深入的理解。好記性不如爛筆頭!

在日志處理這部分主要是aop的使用,通過切面的方式來整合到項目了,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效率。

人話:Aop 在不改變原有代碼的情況下 , 去增加新的功能

需要了解的:

  • 橫切關(guān)注點(diǎn):跨越應(yīng)用程序多個模塊的方法或功能。即是,與我們業(yè)務(wù)邏輯無關(guān)的,但是我們需要關(guān)注的部分,就是橫切關(guān)注點(diǎn)。如日志 , 安全 , 緩存 , 事務(wù)等等 ....
  • 切面(ASPECT):橫切關(guān)注點(diǎn) 被模塊化 的特殊對象。即,它是一個類。
  • 通知(Advice):切面必須要完成的工作。即,它是類中的一個方法。
  • 切入點(diǎn)(PointCut):切面通知 執(zhí)行的 “地點(diǎn)”的定義。
  • 連接點(diǎn)(JointPoint):與切入點(diǎn)匹配的執(zhí)行點(diǎn)。

通知(Advice)里面還有幾種方法來幫助實(shí)現(xiàn),這里我列舉了該部分實(shí)現(xiàn)的方法:

  1. doBefore方法(方法前執(zhí)行),需要注解@Before實(shí)現(xiàn)
  2. After方法(方法后執(zhí)行),需要注解@After實(shí)現(xiàn)
  3. doAfterReturning方法,需要注解@AfterReturning實(shí)現(xiàn)

具體實(shí)現(xiàn)看后面部分。

重要部分:導(dǎo)入依賴

<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>

提醒:導(dǎo)入包以后,刷新下Maven,如果運(yùn)行的時候找不到包,重啟試試,網(wǎng)上有很多的解決方法(也試過),最后個人只是重啟一下子再刷新下maven就可以使用了。

這里就沒有給出解決方法,只是一個提醒。

實(shí)現(xiàn)過程:

創(chuàng)建一個類(LogAspect),將該類定義成一個切面(@Aspect)并且加入容器中(@Component)。

首先創(chuàng)建一個切入點(diǎn),后面的Advice是建立在切入點(diǎn)上:

@Pointcut("execution(* com.blog.Controller..*.*(..))")
public void log(){}

整個表達(dá)式可以分為五個部分

1、execution():表達(dá)式主體。

2、第一個*號:表示返回類型,*號表示所有的類型。

3、包名:表示需要攔截的包名,后面的兩個句點(diǎn)分別表示當(dāng)前包和當(dāng)前包的所有子包,com.blog.Controller包、子孫包下所有類的方法。

4、第二個*號:表示類名,*號表示所有的類。

5、*(..) :第三個星號表示方法名,*號表示所有的方法,后面括弧里面表示方法的參數(shù),兩個句點(diǎn)表示任何參數(shù)

定義完切入點(diǎn)后,處理前置通知和后置通知:

@Before("log()")
public void doBefore(JoinPoint joinPoint){
    System.out.println("在進(jìn)入controller之前處理流-------------");
}
@After("log()")
public void doAfter(){
    System.out.println("在進(jìn)入controller之后處理流-------------");
}
//在切入點(diǎn)return內(nèi)容之后切入內(nèi)容(可以用來對處理返回值做一些加工處理)
@AfterReturning(returning = "result",pointcut="log()")
public void doAfterReturning(Object result){
    logger.info("Return ------ {}",result );
}

通過上述的簡單介紹,可以知道我們?nèi)绻枰佬枨罄锩娴囊?,我們的重點(diǎn)應(yīng)該放到前置通知里面,在流處理之前獲取前端操作的信息。

核心代碼如下:

//通過上下文來獲取請求里面的信息
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

HttpServletRequest request = attributes.getRequest();
//獲取封裝了署名信息的對象,在該對象中可以獲取到目標(biāo)方法名,所屬類的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,來保存相關(guān)信息*/
RequestData requestData = new RequestData(
    url, addr, classMethod, joinPoint.getArgs()
);
//在控制臺打印出來
logger.info("RequestData------{}",requestData);

創(chuàng)建的類是內(nèi)部類(RequestData),只是封裝一下需要打印的信息。

實(shí)驗(yàn)效果:

在進(jìn)入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
在進(jìn)入controller之后處理流-------------

項目的github地址

參考文獻(xiàn):

狂神說Spring

表達(dá)式參數(shù)

總結(jié)

到此這篇關(guān)于SpringBoot開發(fā)教程之AOP日志處理的文章就介紹到這了,更多相關(guān)SpringBoot AOP日志處理 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java synchronized重量級鎖實(shí)現(xiàn)過程淺析

    Java synchronized重量級鎖實(shí)現(xiàn)過程淺析

    這篇文章主要介紹了Java synchronized重量級鎖實(shí)現(xiàn)過程,synchronized是Java里的一個關(guān)鍵字,起到的一個效果是"監(jiān)視器鎖",它的功能就是保證操作的原子性,同時禁止指令重排序和保證內(nèi)存的可見性
    2023-02-02
  • JSON在Java中的使用方法實(shí)例

    JSON在Java中的使用方法實(shí)例

    對于java來說,json的對象也是分為JSONObject和JSONArray這兩種,每種對象的操作方式不一樣哦,下面這篇文章主要給大家介紹了關(guān)于JSON在Java中使用的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • java調(diào)用回調(diào)機(jī)制詳解

    java調(diào)用回調(diào)機(jī)制詳解

    這篇文章主要介紹了java調(diào)用回調(diào)機(jī)制詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 在Spring Boot中使用Spring-data-jpa實(shí)現(xiàn)分頁查詢

    在Spring Boot中使用Spring-data-jpa實(shí)現(xiàn)分頁查詢

    如何使用jpa進(jìn)行多條件查詢以及查詢列表分頁呢?下面我將介紹兩種多條件查詢方式。具體實(shí)例代碼大家參考下本文吧
    2017-07-07
  • MyBatis Map結(jié)果的Key轉(zhuǎn)為駝峰式

    MyBatis Map結(jié)果的Key轉(zhuǎn)為駝峰式

    今天小編就為大家分享一篇關(guān)于MyBatis Map結(jié)果的Key轉(zhuǎn)為駝峰式,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • java實(shí)現(xiàn)高效下載文件的方法

    java實(shí)現(xiàn)高效下載文件的方法

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)高效下載文件的幾種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Java SSM整合開發(fā)統(tǒng)一結(jié)果封裝詳解

    Java SSM整合開發(fā)統(tǒng)一結(jié)果封裝詳解

    這篇文章主要介紹了Java SSM整合開發(fā)實(shí)現(xiàn)統(tǒng)一結(jié)果封裝,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Java CharacterEncodingFilter案例詳解

    Java CharacterEncodingFilter案例詳解

    這篇文章主要介紹了Java CharacterEncodingFilter案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java創(chuàng)建線程三種方式的優(yōu)缺點(diǎn)

    Java創(chuàng)建線程三種方式的優(yōu)缺點(diǎn)

    今天小編就為大家分享一篇關(guān)于Java創(chuàng)建線程三種方式的優(yōu)缺點(diǎn),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java詳細(xì)講解依賴注入的方式

    Java詳細(xì)講解依賴注入的方式

    Idea中使用@Autowire注解會出現(xiàn)提示黃線,強(qiáng)迫癥患者看著很難受,使用構(gòu)造器注入或者setter方法注入后可解決,下面我們一起來看看
    2022-06-06

最新評論