2012-08-29 41 views
0

我在@service類實現中使用Spring的AOPContext.currentProxy()。然而,我在一個靜態方法使用它,我像做從靜態方法調用AOPContext.currentProxy()

public static void addCustomer() { 
    //.... 

    ((CustomerService) AopContext.currentProxy()).addCustomer(); 

    //... 

不過,我得到的錯誤 - 「找不到代理」設置暴露代理爲true。

正在使用靜態方法這種錯誤的原因?

注: 「addCustomer」 方法也提前靜態

感謝。

回答

1

我不確定你想要做什麼,但是你不能這樣做。

static方法的調用在編譯時解析,因此它們不受基於代理的AOP的影響。換句話說:

  • AopContext.currentProxy()一個靜態方法是沒有意義的(除非你想獲得一個代理封閉一些實例方法調用)內,因爲靜態方法的調用沒有代理
  • 調用由AopContext.currentProxy()返回的實例上的靜態方法沒有意義,因爲它在編譯時使用靜態類型的表達式解析,即它編譯爲CustomerService.addCustomer()
+0

這是一個biggg錯誤我發現我現有的代碼,並希望檢查是否這樣做這樣做是錯誤的。一個靜態方法不與一個bean相關聯,因此不能通過調用AopContext.currentProxy()來獲得代理。我寫 –

+0

@axtavt:我現在無法測試它,但我不明白爲什麼在靜態方法中調用'AopContext.currentProxy()'沒有任何意義。它從線程局部變量中獲取它的值。也許這是令人困惑的或者不是用戶期望的,但我認爲它必須奏效。 – sinuhepop

+1

@sinuhepop:編輯更清楚,謝謝。 – axtavt

0

您的配置是否包含類似<aop:config expose-proxy="true" />的東西?

3

代理配置是在實例創建時注入的。假設使用此代理創建的實例,您正在調用方法AOP適用於該方法。假設沒有代理實例或者使用類名(在靜態的情況下)你調用的方法是直接調用代理配置沒有注入實例,所以AOP不適用於該方法調用。