中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot如何實現AOP日志處理

發布時間:2021-10-18 09:13:42 來源:億速云 閱讀:124 作者:小新 欄目:開發技術

這篇文章主要介紹SpringBoot如何實現AOP日志處理,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

    日志處理:

    需求分析

    日志處理需要記錄的是:

    1. 請求的URL

    2. 訪問者IP

    3. 調用的方法

    4. 傳入的參數

    5. 返回的內容

    上面的內容要求在控制臺和日志中輸出。

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

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

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

    需要了解的:

    • 橫切關注點:跨越應用程序多個模塊的方法或功能。即是,與我們業務邏輯無關的,但是我們需要關注的部分,就是橫切關注點。如日志 , 安全 , 緩存 , 事務等等 ....

    • 切面(ASPECT):橫切關注點 被模塊化 的特殊對象。即,它是一個類。

    • 通知(Advice):切面必須要完成的工作。即,它是類中的一個方法。

    • 切入點(PointCut):切面通知 執行的 “地點”的定義。

    • 連接點(JointPoint):與切入點匹配的執行點。

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

    1. doBefore方法(方法前執行),需要注解@Before實現

    2. After方法(方法后執行),需要注解@After實現

    3. doAfterReturning方法,需要注解@AfterReturning實現

    具體實現看后面部分。

    重要部分:導入依賴

    <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,如果運行的時候找不到包,重啟試試,網上有很多的解決方法(也試過),最后個人只是重啟一下子再刷新下maven就可以使用了。

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

    實現過程:

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

    首先創建一個切入點,后面的Advice是建立在切入點上:

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

    整個表達式可以分為五個部分

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

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

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

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

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

    定義完切入點后,處理前置通知和后置通知:

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

    通過上述的簡單介紹,可以知道我們如果需要知道需求里面的要求,我們的重點應該放到前置通知里面,在流處理之前獲取前端操作的信息。

    核心代碼如下:

    //通過上下文來獲取請求里面的信息
    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();
    
    /*創建一個類RequestData,來保存相關信息*/
    RequestData requestData = new RequestData(
        url, addr, classMethod, joinPoint.getArgs()
    );
    //在控制臺打印出來
    logger.info("RequestData------{}",requestData);

    創建的類是內部類(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之后處理流-------------

    以上是“SpringBoot如何實現AOP日志處理”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    宜兰县| 白朗县| 武威市| 揭东县| 汉沽区| 虎林市| 长泰县| 梧州市| 衢州市| 曲麻莱县| 咸宁市| 芒康县| 宜城市| 甘孜| 平和县| 兴业县| 游戏| 灵寿县| 盖州市| 蒙阴县| 招远市| 桐城市| 托克托县| 南安市| 周宁县| 西峡县| 临沭县| 昌图县| 铁岭市| 清涧县| 北流市| 英山县| 满洲里市| 道孚县| 图木舒克市| 南宫市| 盐津县| 鄂托克前旗| 镇巴县| 鹤峰县| 富锦市|