簡體   English   中英

@Around in Spring 啟動@After、@Before、@AfterReturning的AOP組合

[英]@Around in Spring Boot AOP combination of @After, @Before, @AfterReturning

我們可以說spring boot AOP中的@Around注解是@Before和@After方法的結合。

@Around("myPointCut()")
public Object applicationLogger(ProceedingJoinPoint joinPoint){
    logger.info(" for the Method : " + joinPoint.getSignature().getName() +
                    " Request received : {}", Arrays.toString(joinPoint.getArgs()));
    Object res = null;
    try {
        res = joinPoint.proceed();
        logger.info(" for the Method :"+ joinPoint.getSignature().getName() +
                        " Response received : {}", res);
    } catch (Throwable throwable) {
        throwable.printStackTrace();
    }
    return res;
}

通過使用@Around 注解的這個通知方法,我們可以獲取輸入參數以及返回的 object,proceed() 創建一個代理演示 class 並調用實際實現的方法。 如果假設我們沒有@Around 注釋,那么我們將不得不使用@Before 和@After 注釋以及兩個單獨的方法來實現輸入和output 參數。

所以我們可以說只有@Around 注釋就足夠了,我們不需要@Before、@After、@AfterReturning 注釋,因為這些都由@Around 提供。

你是對的。 基本上,對於應用了多個@Before@After@AfterReturing@AfterThrowing建議的方法,可以將其轉換為單個@Around建議。

主要區別在於@Around是一種更通用的通知類型,它為您提供了最大的靈活性。 您可以完全控制如何在方法調用上應用建議,而其他更具體的建議類型為您提供了執行此類操作的聲明方法(例如,使用@Order來定義執行順序)。 因此,如果您想以命令式(即@Around )或聲明式方式進行操作,這只是一個問題。

並且 spring 文檔也有一些關於如何在它們之間進行選擇的注釋。 我根據你的問題的上下文稍微修改它們如下:

@Around提供與其他符合 AOP 聯盟的 AOP 實現的互操作性。 其他更具體的建議類型實現了常見的 AOP 概念,但是以特定於 Spring 的方式實現。 雖然使用最具體的通知類型有優勢,但如果您可能想要在另一個 AOP 框架中運行方面,請堅持使用@Around建議。

更具體的建議的主要優點是不需要調用proceed()方法,因此不會無意中無法繼續沿攔截器鏈進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM