日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

SpringBoot面向切面编程-用AOP方式管理日志

發(fā)布時(shí)間:2025/4/5 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot面向切面编程-用AOP方式管理日志 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

面向切面編程

認(rèn)識(shí)AOP
AOP(Aspect Oriented Program,面向切面編程)把業(yè)務(wù)功能分為核心、非核心兩部分。

核心業(yè)務(wù)功能非核心業(yè)務(wù)功能
用戶登錄,增加數(shù)據(jù),刪除數(shù)據(jù)性能統(tǒng)計(jì),日志,事務(wù)管理

在Spring 的面向切面編程(AOP)思想里,非核心業(yè)務(wù)功能被定義為切面。核心業(yè)務(wù)功能和切面功能先被分別進(jìn)行獨(dú)立開(kāi)發(fā),然后把切面功能和核心業(yè)務(wù)功能編織在一起,這就是AOP。

AOP中的概念

  • 切入點(diǎn)(pointcut):在哪些類(lèi)、哪些方法上切入
  • 通知(advice):在方法前、方法后、方法前后做什么
  • 切面(aspect):切面=切入點(diǎn)+通知。也就是在什么時(shí)機(jī)、什么地方,做什么
  • 織入(weaving):把切面加入對(duì)象,并創(chuàng)建出代理對(duì)象的過(guò)程
  • 環(huán)繞通知:AOP中最強(qiáng)大、靈活的通知,它集成了前置和后置通知,保留了連接點(diǎn)原有的方法。
  • 實(shí)例:用AOP方式管理日志

    實(shí)驗(yàn)結(jié)果
    登錄網(wǎng)址

    http://localhost:8080/aoptest

    查看到

    同時(shí)控制臺(tái)顯示信息

    URL:http://localhost:8080/aoptestHTTP方法:GETIP地址:0:0:0:0:0:0:0:1類(lèi)的方法:com.example.demo.controller.AopLogController.aVoid參數(shù):null應(yīng)答值:hello aop test費(fèi)時(shí):12

    pom.xml添加依賴
    這里初學(xué)者踩坑:配置切面@Aspect不管用,是因?yàn)闆](méi)有下面的spring-boot-starter-aop依賴

    <!-- SpringBoot 攔截器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency>

    代碼
    編寫(xiě)AOP日志注解類(lèi)
    AopLog.java
    下面代碼的解釋:
    @Before:在切入點(diǎn)開(kāi)始處切入內(nèi)容
    @After:在切入點(diǎn)結(jié)尾處切入內(nèi)容
    @AfterReturning:在切入點(diǎn)返回內(nèi)容之后切入內(nèi)容,可以用來(lái)對(duì)處理返回值做一些加工處理
    @Around:在切入點(diǎn)前后切入內(nèi)容,并控制何時(shí)執(zhí)行切入點(diǎn)自身的內(nèi)容
    @AfterThrowing:用來(lái)處理當(dāng)切入內(nèi)容部分拋出異常之后的處理邏輯
    @Aspect:標(biāo)記為切面類(lèi)
    @Component:把切面類(lèi)加入IoC容器中,讓Spring來(lái)進(jìn)行管理

    package com.example.demo.aop;import org.apache.commons.lang3.builder.ToStringBuilder; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.*;//這里包含.Aspect import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web. context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes;import javax.annotation.processing.SupportedSourceVersion; import javax.servlet.http.HttpServletRequest; import java.util.Arrays;@Aspect//使之成為切面類(lèi)@Component//把切面類(lèi)加入loC容器中public class AopLog {private Logger logger=LoggerFactory.getLogger(this.getClass());//線程局部的變量,用于解決多線程中相同變量的訪問(wèn)沖突問(wèn)題ThreadLocal<Long> startTime=new ThreadLocal<>();//定義切點(diǎn)@Pointcut("execution(public * com.example..*.*(..))")public void aopWebLog(){}@Before("aopWebLog()")public void doBefore(JoinPoint joinPoint) throws Throwable{startTime.set(System.currentTimeMillis());//接收到請(qǐng)求,記錄請(qǐng)求內(nèi)容ServletRequestAttributes attributes=(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();HttpServletRequest request=attributes.getRequest();//記錄下請(qǐng)求內(nèi)容logger.info("URL:"+request.getRequestURL().toString());logger.info("HTTP方法:"+request.getMethod());logger.info("IP地址:"+request.getRemoteAddr());logger.info("類(lèi)的方法:"+joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());logger.info("參數(shù):"+request.getQueryString());}@AfterReturning(pointcut = "aopWebLog()",returning = "retObject")public void doAfterReturning(Object retObject) throws Throwable{//處理完請(qǐng)求,返回內(nèi)容logger.info("應(yīng)答值:"+retObject);logger.info("費(fèi)時(shí):"+(System.currentTimeMillis()-startTime.get()));}//方法拋出異常退出時(shí)執(zhí)行的通知@AfterThrowing(pointcut = "aopWebLog()",throwing = "ex")public void addAfterThrowingLogger(JoinPoint joinPoint,Exception ex){logger.error("執(zhí)行 "+" 異常",ex);} }

    2.控制器
    AopLogController.java

    package com.example.demo.controller;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;@RestController public class AopLogController {@GetMapping("/aoptest")public String aVoid(){return "hello aop test";} }

    總結(jié)

    以上是生活随笔為你收集整理的SpringBoot面向切面编程-用AOP方式管理日志的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 淫综合网| 免费久久视频 | 国产一线在线 | 伊人久久久久久久久久久久久 | 久久永久免费 | 国产一区网站 | 欧美福利在线观看 | 欧美91看片特黄aaaa | 日韩欧美国产中文字幕 | 一区二区三区视频在线免费观看 | 波多野结衣视频一区 | 午夜写真片福利电影网 | 肉色超薄丝袜脚交一区二区图片 | 18禁免费无码无遮挡不卡网站 | 黄色亚洲视频 | 免费看国产曰批40分钟粉红裤头 | 亚洲小视频在线观看 | 亚洲欧洲在线观看 | 精品美女久久 | 成人h动漫精品一区二区 | 蜜桃av成人 | 99久久99久久精品国产片桃花 | 我色综合 | 天天曰天天干 | 国产在线视频自拍 | 国产一区精品无码 | 久久合合 | 91麻豆映画传媒 | 逼逼av网站 | 蜜桃av免费在线观看 | 亚洲av成人精品一区二区三区 | 国产娇小hdxxxx乱 | 人妻夜夜爽天天爽三区麻豆av网站 | 色婷婷av一区二区三区四区 | 香蕉视频日本 | 亚洲三区精品 | 先锋资源av网 | 亚洲精品综合 | 国产黄色片在线观看 | 国产传媒一区二区三区 | 操人视频网站 | 国产超碰97 | 玩偶姐姐在线看 | 久久人人爽人人爽人人 | 亚洲综合国产精品 | 人妻无码一区二区三区久久 | 久久99草 | 国产精品毛片视频 | 伊人网站在线观看 | 午夜xxx| 欧美日韩国产精品成人 | 色网在线免费观看 | 在哪里可以看黄色片 | 91刺激 | 这里只有精品免费视频 | 国产日韩在线免费观看 | 久久久久亚洲日日精品 | 天天激情站| 影音先锋国产精品 | 国产伦精品一区二区三区网站 | av射进来 | 深夜福利免费观看 | 95视频在线 | 日本一区二区三区免费看 | 波多一区| 国产精品亚州 | av免费精品 | 一级特黄色大片 | 美女一区| 色av中文字幕 | 国产理论片 | 久久午夜夜伦鲁鲁片 | 亚洲AV乱码国产精品观看麻豆 | 日本少妇影院 | 男生和女生差差的视频 | 亚洲精品成人片在线观看精品字幕 | 99久久久无码国产精品免费蜜柚 | 好了av在线 | 在线亚洲一区二区 | 哈利波特3在线观看免费版英文版 | 深夜福利亚洲 | 国产三级在线观看 | 久久久久久艹 | 亚洲免费成人av | 成人黄色电影网址 | 国产精品va在线观看无码 | 色片免费观看 | 美妇湿透娇羞紧窄迎合 | 久久久99精品国产一区二区三区 | 亚洲欧美日韩激情 | 丁香在线 | 黄色大片网站在线观看 | 亚洲天堂成人在线 | 精品人妻aV中文字幕乱码色欲 | 用舌头去添高潮无码视频 | av噜噜在线| 免费在线播放 | 在线观看色网 | 91久久精品夜夜躁日日躁欧美 |