簡體   English   中英

特定帶注釋變量的AOP切入點表達式

[英]AOP pointcut expression for specific annotated variable

我有這樣的情況。

自定義注釋定義...

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CacheMe{
   String node();
}

用戶詳細信息類別...

class User {
  String name;
  String ssn; 
}

還有一個以“ User”對象作為變量並使用@CacheMe注釋的類

Class Test{

   @CacheMe(node="user")
   User user;

   public User getUser(Long id){
       if(user != null){
       user = someImplementingClass.getUserDetails(id);
      }
      ....
      .....   
   }

}

當驗證“用戶”對象為null或訪問用戶對象時,我需要切入點表達式。 我正在使用基於Spring模式的AOP。

謝謝你的時間。

正如前面的評論中指出的那樣,spring AOP不支持領域級別的建議。 原因是因為Spring AOP使用代理(在類或接口級別,具體取決於特定方案)。 代理包裝一個實例,並能夠檢測方法調用。 如果考慮到這一點,包裝器將無法檢測到屬性修改,因為根本無法覆蓋屬性,因此只能從Java角度對其進行陰影處理。

借助Spring AOP,您將能夠為吸氣者和設置者提供建議,但是如果您需要現場咨詢,那么您唯一的選擇就是AspectJ。 (如果您需要建議構造函數和異常引發,則同樣適用)。

在此處查看快速的AspectJ參考並牢記如果走這條路,可能需要使用這些切入點:

  • get(Signature) :對匹配Signature的任何字段的每個引用
  • set(Signature) :對與Signature匹配的任何字段的每個分配。 可以使用args切入點公開分配的值

另外,如果您決定使用AspectJ,則需要在應用程序中進行一些設置,並確定是希望使用Load-weaving還是Compile-Time-Weaving。 這項決定會帶來重要的后果,您可能需要牢記

暫無
暫無

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

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