最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot@Aspect 打印訪問請求和返回數(shù)據(jù)方式

 更新時間:2021年09月11日 09:21:14   作者:史上最強的弟子  
這篇文章主要介紹了SpringBoot@Aspect 打印訪問請求和返回數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

SpringBoot@Aspect 打印訪問請求和返回數(shù)據(jù)

為什么要用aspect, 使用aspect 可以使記錄日志的功能面向切面,這樣可以降低代碼的耦合性。提供了兩種方式對輸入輸出的數(shù)據(jù)進行打日志,如下:

aspect:第一種方式

@Before 和 @AfterReturning 來對 controller 進行切面。

輸出數(shù)據(jù):

aspect:第二種方式

@Around 來對controller 進行切面。

輸出數(shù)據(jù):

兩種方法都是能夠?qū)φ埱髷?shù)據(jù)做日志監(jiān)控。

第一種方式和第二種方式有一些不同,第二種方式使用的是@Around 環(huán)繞的方式去做的處理,joinPoint.proceed()返回數(shù)據(jù)需要等方法執(zhí)行完才能執(zhí)行下面的代碼,這種是阻塞式的請求,所以個人建議還是采用第一種方法比較合適。

SpringBoot @Aspect注解詳情

1、添加maven依賴注解

        <!--springBoot的aop-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

2、添加AOP類

@Component
@Aspect
public class JournalServiceAspect {
}

3、設(shè)置切面點

    /**切面點*/
    private final String POINT_CUT = "execution(* com.xx.xx..*(..))";
    @Pointcut(POINT_CUT)
    private void pointcut(){}

4、配置前置通知

/** 
 * 前置通知,方法調(diào)用前被調(diào)用 
 * @param joinPoint 
 */  
@Before(value = POINT_CUT)
public void before(JoinPoint joinPoint){
    logger.info("前置通知");
    //獲取目標方法的參數(shù)信息  
    Object[] obj = joinPoint.getArgs();  
    //AOP代理類的信息  
    joinPoint.getThis();  
    //代理的目標對象  
    joinPoint.getTarget();  
    //用的最多 通知的簽名  
    Signature signature = joinPoint.getSignature();  
    //代理的是哪一個方法  
    logger.info("代理的是哪一個方法"+signature.getName());  
    //AOP代理類的名字  
    logger.info("AOP代理類的名字"+signature.getDeclaringTypeName());  
    //AOP代理類的類(class)信息  
    signature.getDeclaringType();  
    //獲取RequestAttributes  
    RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();  
    //從獲取RequestAttributes中獲取HttpServletRequest的信息  
    HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);  
    //如果要獲取Session信息的話,可以這樣寫:  
    //HttpSession session = (HttpSession) requestAttributes.resolveReference(RequestAttributes.REFERENCE_SESSION);  
    //獲取請求參數(shù)
    Enumeration<String> enumeration = request.getParameterNames();  
    Map<String,String> parameterMap = Maps.newHashMap();  
    while (enumeration.hasMoreElements()){  
        String parameter = enumeration.nextElement();  
        parameterMap.put(parameter,request.getParameter(parameter));  
    }  
    String str = JSON.toJSONString(parameterMap);  
    if(obj.length > 0) {  
        logger.info("請求的參數(shù)信息為:"+str);
    }  
}

**注意:這里用到了JoinPoint和RequestContextHolder。

1)、通過JoinPoint可以獲得通知的簽名信息,如目標方法名、目標方法參數(shù)信息等。

2)、通過RequestContextHolder來獲取請求信息,Session信息。**

5、配置后置返回通知

/** 
 * 后置返回通知 
 * 這里需要注意的是: 
 *      如果參數(shù)中的第一個參數(shù)為JoinPoint,則第二個參數(shù)為返回值的信息 
 *      如果參數(shù)中的第一個參數(shù)不為JoinPoint,則第一個參數(shù)為returning中對應(yīng)的參數(shù) 
 * returning:限定了只有目標方法返回值與通知方法相應(yīng)參數(shù)類型時才能執(zhí)行后置返回通知,否則不執(zhí)行,
 *            對于returning對應(yīng)的通知方法參數(shù)為Object類型將匹配任何目標返回值 
 * @param joinPoint 
 * @param keys 
 */  
@AfterReturning(value = POINT_CUT,returning = "keys")  
public void doAfterReturningAdvice1(JoinPoint joinPoint,Object keys){  
    logger.info("第一個后置返回通知的返回值:"+keys);  
}  
@AfterReturning(value = POINT_CUT,returning = "keys",argNames = "keys")  
public void doAfterReturningAdvice2(String keys){  
    logger.info("第二個后置返回通知的返回值:"+keys);  
}  

6、后置異常通知

/** 
 * 后置異常通知 
 *  定義一個名字,該名字用于匹配通知實現(xiàn)方法的一個參數(shù)名,當目標方法拋出異常返回后,將把目標方法拋出的異常傳給通知方法; 
 *  throwing:限定了只有目標方法拋出的異常與通知方法相應(yīng)參數(shù)異常類型時才能執(zhí)行后置異常通知,否則不執(zhí)行, 
 *            對于throwing對應(yīng)的通知方法參數(shù)為Throwable類型將匹配任何異常。 
 * @param joinPoint 
 * @param exception 
 */  
@AfterThrowing(value = POINT_CUT,throwing = "exception")  
public void doAfterThrowingAdvice(JoinPoint joinPoint,Throwable exception){  
    //目標方法名:  
    logger.info(joinPoint.getSignature().getName());  
    if(exception instanceof NullPointerException){  
        logger.info("發(fā)生了空指針異常!!!!!");  
    }  
}  

7、后置最終通知

/** 
 * 后置最終通知(目標方法只要執(zhí)行完了就會執(zhí)行后置通知方法) 
 * @param joinPoint 
 */  
@After(value = POINT_CUT)  
public void doAfterAdvice(JoinPoint joinPoint){ 
    logger.info("后置最終通知執(zhí)行了!!!!");  
}  

8、環(huán)繞通知

/** 
 * 環(huán)繞通知: 
 *   環(huán)繞通知非常強大,可以決定目標方法是否執(zhí)行,什么時候執(zhí)行,執(zhí)行時是否需要替換方法參數(shù),執(zhí)行完畢是否需要替換返回值。 
 *   環(huán)繞通知第一個參數(shù)必須是org.aspectj.lang.ProceedingJoinPoint類型 
 */  
@Around(value = POINT_CUT)  
public Object doAroundAdvice(ProceedingJoinPoint proceedingJoinPoint){  
    logger.info("環(huán)繞通知的目標方法名:"+proceedingJoinPoint.getSignature().getName());  
    try {  
        Object obj = proceedingJoinPoint.proceed();  
        return obj;  
    } catch (Throwable throwable) {  
        throwable.printStackTrace();  
    }  
    return null;  
}  

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • IDEA如何導入已有Maven項目

    IDEA如何導入已有Maven項目

    導入Maven項目到IDEA時,經(jīng)常遇到問題,本文記錄正確步驟,首先創(chuàng)建空項目,然后選擇Import Module from external model并選擇Maven,勾選所需profiles和Maven項目,最后設(shè)置Project SDK,這樣配置后,項目結(jié)構(gòu)將符合預(yù)期,僅顯示一個Module
    2024-11-11
  • 使用RocketMQTemplate發(fā)送帶tags的消息

    使用RocketMQTemplate發(fā)送帶tags的消息

    這篇文章主要介紹了使用RocketMQTemplate發(fā)送帶tags的消息,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java數(shù)據(jù)結(jié)構(gòu)及算法實例:漢諾塔問題 Hanoi

    Java數(shù)據(jù)結(jié)構(gòu)及算法實例:漢諾塔問題 Hanoi

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)及算法實例:漢諾塔問題 Hanoi,本文直接給出實現(xiàn)代碼,代碼中包含大量注釋,需要的朋友可以參考下
    2015-06-06
  • java實現(xiàn)單鏈表中的增刪改

    java實現(xiàn)單鏈表中的增刪改

    這篇文章主要為大家詳細介紹了java實現(xiàn)單鏈表中的增刪改,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 如何為?Spring?Boot?項目配置?Logback?日志

    如何為?Spring?Boot?項目配置?Logback?日志

    由于?Spring?Boot?的默認日志框架選用的?Logback,再加上?Log4j2?之前爆過嚴重的漏洞,所以我們這次就只關(guān)注?Logback,本文重點給大家介紹如何為?Spring?Boot?項目配置?Logback?日志,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • 詳解Java的位運算

    詳解Java的位運算

    這篇文章主要介紹了詳解Java的位運算,程序中的所有數(shù)在計算機內(nèi)存中都是以二進制的形式儲存的。位運算就是直接對整數(shù)在內(nèi)存中的二進制位進行操作,需要的朋友可以參考下
    2023-04-04
  • JAVA基礎(chǔ)之繼承(inheritance)詳解

    JAVA基礎(chǔ)之繼承(inheritance)詳解

    繼承(inheritance)是Java OOP中一個非常重要的概念。這篇文章主要介紹了JAVA基礎(chǔ)之繼承(inheritance),需要的朋友可以參考下
    2017-03-03
  • Java鎖擦除與鎖粗化概念和使用詳解

    Java鎖擦除與鎖粗化概念和使用詳解

    這篇文章主要介紹了Java鎖擦除與鎖粗化概念和使用,鎖擦除的主要判定依據(jù)來源于逃逸分析的數(shù)據(jù)支持,如果判斷在一段代碼中,堆上的所有數(shù)據(jù)都不會逃逸出去從而被其他線程訪問到,那就可以把它們當做棧上數(shù)據(jù)對待,認為它們是線程私有的,同步加鎖自然就無須進行
    2023-02-02
  • Java編程在ICPC快速IO實現(xiàn)源碼

    Java編程在ICPC快速IO實現(xiàn)源碼

    這篇文章主要介紹了Java Fast IO in ICPC實現(xiàn)源碼,具有一定參考價值,需要的朋友可以了解下。
    2017-09-09
  • 如何使用NSSM將jar包打成Windows服務(wù)

    如何使用NSSM將jar包打成Windows服務(wù)

    這篇文章主要介紹了如何使用NSSM將jar包打成Windows服務(wù),本文通過圖文并茂的形式給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-03-03

最新評論

黄大仙区| 施秉县| 化隆| 云梦县| 秦皇岛市| 郎溪县| 南宁市| 武穴市| 芜湖市| 黔江区| 武定县| 洛扎县| 方山县| 徐水县| 夏河县| 余干县| 睢宁县| 礼泉县| 道孚县| 文成县| 顺义区| 佛山市| 山东| 孝昌县| 东乌珠穆沁旗| 泸水县| 荥经县| 大宁县| 沐川县| 广宗县| 四会市| 射阳县| 古蔺县| 明星| 德清县| 盐边县| 阿鲁科尔沁旗| 汉阴县| 蒙城县| 江川县| 满洲里市|