簡體   English   中英

Spring AOP切入點,用於在具有注釋的字段上調用的方法

[英]Spring AOP Pointcut for methods invoked on field with annotation

我正在寫一個方面,以使外部庫中的依賴關系返回為我的應用程序正確格式化的值。

考慮到這一點,我創建了一個名稱為@SafeReturns的注釋 我在spring的幫助下從外部庫連接了該類,此外,還添加了注釋。

@SafeReturns
@Autowired
public PermissionsClient client; 

現在,我嘗試對此做一個介紹,但是不幸的是,我無法在該注釋所注釋的字段上捕獲對所有方法的所有調用。 我嘗試了不同的切入點。 例如

@Pointcut("execution(@myApp.SafeReturns * *(..))")

@Around("safeReturnsPointCut()")
public void logAround(ProceedingJoinPoint joinPoint) throws Throwable {    
}

它們都不能幫助我實現捕獲所有方法的行為。 有沒有辦法抓住他們?

您的方法以及關於方面語法和執行邏輯的假設存在幾個問題:

  • 您正在使用Spring AOP,但是由於其基於代理的特性,因此只能與Spring管理的bean /組件一起使用,如Spring AOP手冊中所述 它不適用於非Spring第三方代碼。

  • 為了定位第三方代碼,您需要通過LTW(加載時編織)使用完整的AspectJ。 Spring AOP手冊還介紹了如何配置LTW

  • 您的切入點說的是針對所有方法執行(如果使用Spring AOP,則是Spring組件的方法執行),其中方法由SafeReturns注釋。 無論是Spring AOP還是AspectJ,您都不能期望此語法適用於恰好被分配給具有特定注釋的實例成員變量的對象。 因此,您對如何實現AOP以及如何實現AOP的期望大相徑庭。

我的建議是通過LTW切換到AspectJ,然后編寫切入點,該切入點可以直接針對外部方法execution() ,也可以通過將外部調用路由到帶注釋的Facades上並使用切入點作為目標來間接解決問題。 如果外觀是Spring組件,則甚至可以使用Spring AOP。

還有一種通過高級AspectJ +一些手動簿記解決此問題的直接方法。 您可以使用set()切入點來確定何時將對象分配給您的帶注釋的字段(或以后未分配)。 然后,您可以讓Aspect對指定的對象進行手動記賬,並確保僅當相關對象恰好被分配給帶注釋的成員變量時,才觸發您的方面建議所做的任何事情。 這項工作,我過去也曾做過。 但這意味着您必須編織所有應用程序的方法調用,然后通過簿記中的查詢動態決定是否應執行代碼,因為可能存在未分配給任何帶注釋的對象實例領域。 這會導致一定的性能損失,因為這種情況在編譯期間無法由任何方面的織工確定。 在此處查看我的答案,以獲取有關手動簿記內容的示例代碼。

我希望我的解釋不太復雜,但是您的問題是技術性和復雜性高的。

暫無
暫無

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

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