2012-02-28 96 views
0

我瞭解如何,但似乎無法正式塑造定義。春天DI?接口類型?

由於已知的DI可以通過構造函數或setter或接口完成。 我對最新的一種基於界面的DI感到困惑,是否在春季使用?

更新:我在這裏給了錯誤的檢查,導致錯誤的理解。

要解決它:

說我們有setter和在二傳手我們注入一些類實現的接口。這是通過setter還是接口認爲是DI?

http://martinfowler.com/articles/injection.html#UsingAServiceLocator 本文共分DI上:。

「主要有三種風格的依賴注入我使用他們的名字是構造器注入,Setter注入和接口注入。如果在當前關於Inversion of Control的討論中,你將會聽到這些被稱爲類型1 IoC(接口注入),類型2 IoC(setter注入)和類型3 IoC(構造函數注入)的討論。很難記住,這就是爲什麼我使用了我在這裏的名字。「

Else服務定位符模式用於IoC,它是實際使@Autowired成爲可能的模式嗎? - 也就是說,並非所有的類都需要在xml中聲明爲DI,因爲我們可以將它們聲明爲@Repository或@Controller,或者如果我記得正確的話,可以再次聲明它們。

謝謝,

回答

3

自動裝配的接口裝置線實現該接口的bean。這依賴於bean工廠中實際存在的實現。

@Autowired 
UserService us; // wire a bean implementing UserService 

-

@Service 
public class UserServiceImpl implements UserService { 
    // the @Service annotation causes this implementation of UserService to 
    // be made available for wiring in the bean factory. 
} 

值得注意的是,如果你通過線接口,Spring會想到那裏的bean工廠實現該接口存在一個且只有一個豆。如果找到多個bean,則會拋出錯誤,您將不得不指定要連線的bean(使用@Qualifier註釋)。

編輯:

配線時,則可以電線的成員變量或setter方法。

@Autowired 
UserService us; 

-

@Autowired 
public void setUserService(UserService us) { 
    this.us = us; 
} 

這兩個產生相同的結果。不同的是,在前者中,Spring將使用反射將變量us設置爲實現UserService的bean。在後者中,Spring將調用setUserService方法,傳遞相同的UserService實例。

+0

請與其他DI方法比較,因爲現在我更加困惑。我明白了意思,但讓我們暫時離開@Autowired。(忘了上下文:組件掃描 - 說我們沒有它)請通過setter和接口顯示DI之間的差異 - 你可以在setter中設置接口 - 然後通過接口或通過setter調用什麼?那麼爲什麼它通過設置器或接口在DI上正式分配。 – Aubergine 2012-02-28 09:19:37

+0

「通過設置者和界面的DI之間的區別」 - 蘋果和橙子,他們沒有任何關係。見上面的編輯。 – pap 2012-02-28 09:29:12

+0

我完全理解你在做什麼以及它是如何工作的(我自己實現了,它的工作非常出色)這就是我認爲它無法比擬的。但爲什麼本文的作者將接口注入與setter和構造函數注入一起沿着這條線? – Aubergine 2012-02-28 09:37:09