2017-09-19 74 views
2

哪一個Bean定義是最佳實踐,爲什麼?哪種方法是最佳實踐?

對於一個示例,類型1可以用於單元測試而不創建上下文。

1型

public class MovieRecommender { 

    private final CustomerPreferenceDao customerPreferenceDao; 

    @Autowired 
    public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) { 
     this.customerPreferenceDao = customerPreferenceDao; 
    } 

    // ... 

} 

2型

public class MovieRecommender { 

    @Autowired 
    public CustomerPreferenceDao customerPreferenceDao; 


    // ... 

} 

回答

1

我想說的第一個是更好的。

爲什麼我會使用它的主要原因是,設置測試更容易和更乾淨。您只需創建嘲笑的依賴關係並將其傳遞給待測組件的構造器。

從Spring 4.3開始,具有單個構造函數的類可以省略@Autowired 註釋。

所以,你可以這樣寫:

public class MovieRecommender { 

    private final CustomerPreferenceDao customerPreferenceDao; 

    public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) { 
     this.customerPreferenceDao = customerPreferenceDao; 
    } 

    // ... 

} 

還有一招。如果你將它與來自Lombok的@AllArgsConstructor一起使用,那麼你也不必編寫構造函數(與場注入相同),並且你也有易於測試的構造函數。

@AllArgsConstructor 
public class MovieRecommender { 

    private final CustomerPreferenceDao customerPreferenceDao; //injected 

} 

所以,如果你使用龍目島,我會去與構造注入+ AllArgsConstructor

還有一些關於這issue偉大的文章。

4

我會說第一個。這不僅是因爲事實上,你可以很容易地測試,但因爲一個簡單的規則

在它的構造函數的最後一個對象應該具有everythig它需要實際執行其任務

(我對不起,我不記得我在哪裏看過:(無論如何,我認爲這是一條很好的規則)

因此,通過實施類似第二種方式,您可以創建實例,不會有他們所需要的。你必須實例化它和設置其依賴關係。如果你忘記了最後一部分會發生什麼?

所以這就是爲什麼我總是建議更換構造注入和設置依賴關係final因此它不會編譯除非你在構造函數中

2

相傳構造函數依賴注入應優於場依賴注入進行設置由於你提到的原因:你不能測試它作爲一個普通的POJO。

在展開構造討論VS setter方法依賴注入具體根據documentation

[..]它是一個好的經驗規則來使用強制 依賴性和setter方法或構造的構造可選 依賴

0

方法我會建議2型

因爲反正你使用註釋注入依賴於類,這是通過使用反射API進行 ..

因此,有沒有使用過的構造函數初始化...

如果你不」不想使用按規定意味着註釋,然後使用 -

如果你正在經歷setter方法創建對象後改變(初始化)值,然後再進行setter注入..

setter注入覆蓋其與構造器注入初始化如果兩個注射可用..

0

第一個(也稱爲構造器依賴注入),主要是因爲其更容易測試屬性的值。如果你想模擬customerPreferenceDao,你可以嘲笑它並將它注入到MovieRecommender的一個實例中。它可以讓你更好地控制你正在做的事情。