1

我試圖理解依賴注入,並沒有完全得到它,除了我已經設法瞭解它使得很難理解別人的代碼。 :'(使用Guice的逆向工程項目策略?

無論如何,我不確定如何簡單描述我的問題,但我會嘗試。我目前是唯一編碼器,負責約六年內由數十位獨立人員完成的Java項目。大量使用Google的Guice庫,我應該採用一些現有的代碼並以不同的方式實現它;特別是,使用現有的密碼認證方法,而不是將其應用於JMenu中的每個JMenuItem,將其應用於整個JMenu ,所以如果輸入了錯誤的密碼或者沒有輸入密碼,那麼所有的JMenuItems都被禁用,如果密碼錯誤就不會發生這種情況,這導致我認爲問題出現在if語句中,這是一個很長的依賴關係:
if (!ViewScanApp.getApplication().getHistoryManager().isAuthenticated())

我追溯到這個過程中,發現HistoryManager類是一個接口,並且我的路徑似乎死了;那裏沒有代碼,並且沒有引用任何其他類。我已經通過對項目中100多個類的隨機探索發現了路徑的終點,但我似乎無法將它們連接起來。我找不到第一個能在這個堆棧的另一端找到的第一個類,AccessManagerImpl,被調用。

我可以使用可能適用於這種情況的依賴注入的解釋。非常感謝!

+0

「依賴注入」就像「新」,除了它發生的魔術,而不是你必須輸入「新」... – 2010-07-07 20:35:43

回答

3

假設HistoryManager接口上沒有@ImplementedBy註釋,您需要檢查Guice Module負責綁定這種類型。

在Eclipse中,有一個命令來查找類的出現。我敢打賭,Netbeans有類似的東西。用它來查找HistoryManager的出現次數。其中至少有一個應該實現com.google.inject.Module(或擴展AbstractModule)。你可能會看到類似

protected void configure() { 
    … 
    bind(HistoryManager.class).to(HistoryManagerImpl.class); 
    … 
} 

或者,如果你想快速和骯髒的經驗,可以在拋出println()

HistoryManager mgr = ViewScanApp.getApplication().getHistoryManager(); 
System.out.println("HistoryManager implementation: " + mgr.getClass()); 
if (!mgr.isAuthenticated()) 
    … 

但是你找到它,HistoryManagerImpl類是你會想要找到路徑。

我還沒有使用它,但Guice graphing tool也可能有幫助。

+0

問題是由一個deus ex machina解決:原始程序員。你給我的測試語句產生了$ proxy7,我不明白。然後,他指出我正確指出我在其他地方看不到的約束力的方向。 – malenkylizards 2010-07-07 20:44:28

1

啓動調試器。它會引導您完成實現該接口的確切類(假設您有源代碼)

1

無論何時在Eclipse中注入Guice時都有一個接口定義,而不是使用F3轉到定義,如果它是一個類,那麼可以使用Ctrl-T在該接口的實現中進行選擇。

如果您有多個選項可供選擇,那麼您需要打印出模塊綁定,以便您知道要選擇哪一個。不幸的是Eclipse還沒有理解注入。