2012-09-21 47 views
0

我正在學習AOP,並且對切入點,忠告等感到舒服。 我會問什麼,我很確定不可能,但是想要問任何問題。爲使用面向方面的編程的方法提供數據

我有一個方法,它需要一個userId,從數據庫中提取用戶的記錄,然後做記錄。我有20種不同的方法可以做不同的事情,但他們都將userId作爲輸入並從數據庫中獲取記錄。對我而言,這看起來像是一個橫切關注點,可以被拉進一個方面。

但是如何?我知道我可以訪問參數(在這種情況下是userId),訪問方法的返回值並捕獲方法異常。但我怎麼給方法一些工作(在這種情況下,記錄在數據庫中?)

public String printUserDetails(String userId) 
{ 
    Record record = Database.fetchRecord(userId); 
    System.out.println(record.getDetails()); 
    return record.getTitle(); 
} 

那麼,有沒有辦法拉該數據庫訪問代碼放到一個方面?我認爲的

一種方式聲明類似下面的輸入

class RequestObject 
{ 
    String userId; 
    Record record; 
} 

並注入記錄在上述方面,然後調用進行()。但這不知何故感覺不對。

+0

我知道這個是舊的,但仍列爲未答覆。如果看起來合適,請您接受並提出我的答案嗎?謝謝。 – kriegaex

回答

1

IMO,使用用戶標識解析用戶不是一個交叉問題,因此方面不是正確的方法。接收userId的第一個登錄頁面實際上應該將其解析爲UserRecord,並且從此開始,userRecord應該是應用程序中移動的那個。

我可以從我的一個應用程序中繪製一個簡單的類比,所有經過身份驗證的servlet都希望servletRequest.getRemoteUser()返回與發送請求的用戶相對應的有效用戶登錄名。我們修改了HttpServletRequest以將其解析爲我們應用程序中的用戶對象,並且所有經過身份驗證的servlet將HttpServletRequest下調爲​​並提取此對象。應用程序中的其他人不再嘗試解析用戶登錄。

0

如果這是你想知道的,你不能從AspectJ訪問方法的局部變量。

問題的其餘部分是關於設計和答案取決於你想達到什麼。您可以使用template method設計模式以多種方法避免代碼重複。如果您將實例或模擬對象重構爲具有成員而非局部變量,則可以將其注入類中。如果您通過直接重構類或通過AspectJ(ITD)[http://www.eclipse.org/aspectj/doc/next/progguide/starting-aspectj.html#inter-type-clairs ]機制。第三個問題是,如果您可能想要使用某個方面進行緩存,以避免多次從數據庫中提取相同的對象。

我不確定你到底想要達到什麼目的,所以我不能更具體地回答。