簡體   English   中英

如何使不正確的切入點表達式引發異常?

[英]How can I make an incorrect pointcut expression throw an exception?

我有以下切入點表達式:

@Pointcut("execution(* apply(..))")

現在,如果建議的方法重命名為applyTo則切入點不再正確,建議將永遠不會觸發。 建議的失敗不會被注意到,因為不正確的切入點不會在應用程序啟動時或運行時引發任何異常。

我已經瀏覽了 Spring AOP 文檔,但找不到一種方法來使切入點因異常而失敗。 有辦法嗎?

安東尼奧是 100% 正確的,這里沒有錯誤。 切入點只是說:“如果您碰巧找到與此描述匹配的連接點,請在那里應用我的方面建議”。

  • 連接點匹配是在 Spring AOP 運行時完成的。 所以它本質上是一個動態的東西。
  • 對於具有加載時編織 (LTW) 的 AspectJ,情況也是如此。 類加載器總是有可能加載新的類,然后這些類會與切入點和編入其中的方面代碼動態匹配。 所以你永遠不會知道你已經“完成”了方面編織。 你什么時候會發出警告或錯誤?
  • 如果您將 AspectJ 與編譯時編織 (CTW) 一起使用,如果在編譯期間建議的切入點根本無法匹配任何連接點,則 AspectJ 編譯器將發出警告Xlint:adviceDidNotMatch 但是想想看,它永遠不過是一個信息或警告,因為如果你編譯了一個方面模塊,你以后想將它應用到多個應用程序或一個應用程序中的其他模塊,無論你是使用 CTW 還是 LTW ,匹配的連接點只有在編織這些模塊時才能找到。

所以這不是錯誤,否則你永遠無法使用方面庫或 LTW。 方面的整體思想是它們獨立於應用程序代碼。

此外,如果您將 99% 的apply方法重命名為applyTo但出於某種原因(意圖或疏忽)保留單個apply方法,則切入點仍將匹配,因此您的假設錯誤也不會產生。 您的錯誤不是句法上的而是語義上的,方面編織者怎么知道這一點? 正如安東尼奧所說,小心重構。 在這種特殊情況下,您可以將切入點更改為apply* ,然后它將同時匹配applyapplyTo但也applyMagic您可能不想要的applyMagic

Stultuske 匹配注解而不是方法名稱的想法是我所說的“窮人的 AOP 方法”,因為它仍然在整個代碼庫中散布與 AOP 相關的信息,因此並沒有兌現 AOP 的承諾,不僅要擺脫代碼糾纏但也是散射。 分散現在僅適用於注釋而不是內聯方法代碼。 如果您根本沒有在應用程序代碼中看到 AOP,我個人最喜歡它,除非您希望以聲明方式應用某些功能,並且出於某種原因在源代碼中使用諸如@Transactional注釋記錄該功能。 但這是一個品味問題,我可能仍然會嘗試將聲明放入方面切入點而不是應用程序中。 只有當整體匹配模式太復雜而無法在切入點中處理時,我才可能使用注釋。 鏈接注釋和方面的廣泛實踐,甚至使某種“AOP 設計模式”被誤導,因此被過度使用,IMO。 這種模式有很好的用途,但比我看到的要少得多。

暫無
暫無

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

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