[英]@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.