2011-11-11 241 views
2

我遇到了一些在spring框架中使用的java類。首先,是在applicationContext.xml爲什麼轉換爲接口而不是轉換爲類java?

<bean id="someBean" parent="txProxyTemplate"> 
    <property name="target"> 
     <bean class="path.to.bean.impl.SomeBeanImpl"> 
      ... 
     </bean> 
... 
</bean> 

豆類和我有接口ISomeBean,其實現SomeBeanImpl 然後,我有一個使用ISomeBean另一個類。

public class SomeOtherClass { 
    ... 
    public function doStuff() { 
     ... 
     ApplicationContext ctx; 
     SomeBean theBean = (SomeBean) ctx.getBean; 
    } 
} 

我想知道爲什麼我們要轉換到接口而不是轉換爲類。

回答

4

爲什麼要將SomeOtherClass與特定實現綁定?使用這個接口,你會得到鬆耦合 - 你可以測試一個假的實現,或者稍後切換到另一個實現。

這是控制反轉的好處的很大一部分 - 你沒有像你的依賴那樣緊密耦合,就好像你直接在類中實例化它們一樣。

+1

這也有助於測試。 – Santosh

+2

@Santosh:因此「你可以測試一個虛假的實施」... –

2

使用依賴注入的一個很大的好處是你的類不必知道使用哪個實現,只需要他們需要一個實現。從而它可以將其轉換爲界面。

但是,您不應該將它與可以或不可以做的事混淆。

1

您投射到一個接口,以保持您的代碼通用和鬆散耦合。一旦你將一個對象投射到一個具體的類上,你已經在你的對象和它的合作者之間增加了一個緊密的耦合。如果協作者的類類型發生變化,則對象的轉換操作可能會中斷 - 導致ClassCastException。相反,如果我們使用接口,您可以自由更改協作者的實現類類型,而不用擔心對客戶端的影響。

3

這種類型的鑄造背後的邏輯是給予Spring IOC和依賴注入的自由。使用這種方法的好處之一是類之間的耦合非常鬆散,例如在你的情況下,如果某些早上你決定改變ISomeBeanImpl的代碼,你不需要改變其他任何東西只要功能不改變..

Spring IOC documentation一看,這個想法會更加清晰......

1

有它的風格方面 - 鬆散耦合和所有。

更具體地說: 如果你正在使用AOP(Spring對許多內置功能默認情況下是事務性支持),例如cglib代理,實際的bean將不是實現類,它將會是一個動態創建的代理類。在這種情況下,您的應用程序將會出現各種類似ClassCast的異常。如果你做出的改變無意中激活了春天的代理行爲,這可能會成爲一個令人討厭的驚喜。

1

依賴注入框架有兩個目標:

  1. 管理生命週期對象的,也就是說,它們是如何創建的。
  2. 解耦從具體實現的代碼,也就是說,你可以無需重新編譯

如果你不感興趣,也沒有1 2接口的實現之間切換,很明顯,你不需要依賴注入:簡單地自己創建這個bean SombeBeanImpl = new SomeBeanImpl()

如果你只對1而不是2感興趣,你可以將你獲得的bean投到SomeBeanImpl,但是你一定會使用它。我懷疑有一種方法可以在Spring中指定你只有一個實現並且沒有接口,但我不確定。

如果您對2感興趣,您的定義也對1感興趣。事實上,如果你不想明確說明要實例化的具體類,你可以將它委託給控制對象創建的factory。這是一個依賴注入框架實際上是一個複雜的工廠。

相關問題