2012-02-26 159 views
0

哪一個是注入我的依賴關係的最佳方式?爲什麼? 兩者有什麼區別?Java - 注入依賴的正確方法?

public abstract class Service { 

    private IConfig config; 

    @Inject 
    public Service(IConfog config) { 
     this.config = config 
    } 
} 

OR

public abstract class Service { 

    @Inject private IConfig config; 

    @Inject 
    public Service() { 

    } 
} 

回答

4

構造方法注入(第一)優於因爲它可以更容易地支持「不可改變」的實體或其行爲被很好地定義和施工後不可修改的實體setter注入。 Constructor vs Setter inject

對於我的經驗法則是先喜歡構造函數注入,跳下來setter注入,如果構造函數注入需要我彎我的背部即與遺留代碼工作時與「OOP getter和setter」方法。

編輯:我假設你正試圖在「構造函數」和「設置」構造函數之間做出決定。但是它似乎也在使用無法實例化的抽象類。也許你有其他想法?

+0

不能說哪種方式更適合樣本setter注入更好,如果在構建時,我們不能或不想注入依賴關係。 – MJM 2012-02-26 06:07:21

3

首先,我不把注入相關的註解在抽象類中 - 在我看來,沒有決定如何,如果它實際上不能被實例化(當然,這只是我與他人意見的東西應該被實例化沒有意義可能同意或不同意)。

通常我做以下列方式:現在

public abstract class AbstractService { 

    private IConfig config; 

    public AbstractService(IConfog config) { 
    this.config = config 
    } 
} 

public class Service extends AbstractService { 
    @Inject 
    public Service(IConfig config) { 
    super(config); 
    } 
} 

,您可以使用這兩個類使用和不使用依賴注入(用手來構建,通過了所有必需的引用)。你也可以確定服務每次都在適當的狀態下被實例化。

1

依賴注入的主要目標是使單元測試易於被允許做

Service serviceToTest = new Service(mockConfig); 

Service serviceToTest = new Service(); 
serviceToTest.setConfig(mockConfig); 

注入依賴的第二種方式使得它不可能做abover。你只能通過讓Guice創建服務並注入一個模擬依賴,或者通過使用反射設置模擬依賴來測試它。