2015-06-09 60 views
0

AOP切入點表達我有一種情況是這樣..特定批註的變量

自定義註釋定義...

@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); 
     } 
     .... 
     ..... 
    } 

} 

當「用戶」對象驗證爲空或訪問用戶對象時,我需要切入點表達式。 我正在使用基於Spring架構的AOP。

謝謝你的時間。

+0

Spring的AOP僅限於方法。它不能攔截字段訪問。 –

+0

Sotirios感謝您的快速回復。如果不是春季AOP,還有其他建議嗎? – joe4java

+0

AspectJ應該支持這一點。 –

回答

1

正如前面的評論指出的那樣,春季AOP不支持現場級別的建議。原因是因爲Spring AOP使用代理(在類或接口級別,取決於特定的場景)。代理包裝實例並能夠檢測方法調用。 如果你考慮這個問題,一個包裝器不能檢測屬性修改,因爲一個屬性根本不能被覆蓋,它只能被映射(從java的角度來看)。

有了Spring AOP,你可以建議getters & setters,但是如果你需要Field建議,那麼你唯一的選擇就是AspectJ。 (如果您需要建議構造函數和異常提升,這同樣適用)。

檢查快速AspectJ的參考here和記住,如果你走這條路,你可能需要使用這些切入點:

  • GET(簽名):每個引用任何領域匹配的簽名
  • 設置(簽名):對與簽名匹配的任何字段的每個賦值。所分配的值可以用args中,該切入點暴露

此外,如果你決定使用AspectJ時,你就需要設置some things in your app,並決定如果你喜歡加載時間編織或編譯時織造。該決定會帶來重要的後果,您可能需要keep in mind

+0

Jose Carlos感謝您的詳細解釋和參考。我會嘗試使用AspectJ。 – joe4java