【轉】Spring中IoC的優勢與缺點

1. 優勢java

咱們知道,在Java基本教程中有一個定律告訴咱們:全部的對象都必須建立;或者說:使用對象以前必須建立,可是如今咱們能夠沒必要必定遵循這個定律了,咱們能夠從Ioc容器中直接得到一個對象而後直接使用,無需事先建立它們。編程

  這種變革,就如同咱們無需考慮對象銷燬同樣;由於Java的垃圾回收機制幫助咱們實現了對象銷燬;如今又無需考慮對象建立,對象的建立和銷燬都無需考慮了,這給編程帶來的影響是巨大的。ruby

  咱們從一個簡單例子開始,有一個普通類B代碼以下:app

public class B implements BI{
    AInfterface a;

    public B(AInfterface a){
      this.a = a
    }

    public void invoke(){
      /** ...*/
    }
}

  有兩種使用B的方式:框架

  普通無Ioc容器的調用方式: 
  BI b = new B(new A());//須要在生成B實例以前 生成A等實例
  b. invoke();this

  使用Ioc容器的革命調用方式:
  BI b = (BI) WebAppUtil.getService(「b」);
  b. invoke();

  上面兩種方式重要區別:
  前者須要照顧B類中A類的實例化,若是B類中調用不僅A類一個,還有更多其餘類如C/D/E等類,這樣,你在使用B類時,還須要研究其餘類的建立,若是C/D/E這些類不是你本身編寫,你還須要翻閱它們的API說明,研究它們應該如何建立?是使用New 仍是工廠模式 仍是單態調用?spa

  這時,你會感嘆:哇,有沒有搞錯?我只不過是爲了使用B類中一個小小的方法,就花去我這麼多時間和精力?xml

  當咱們使用第二種方式時,就無需花不少精力和時間考慮A/C/D/E等類的建立。htm

  使用Ioc容器,你不再必作這些僵化愚蠢的工做了,咱們只需從ioc容器中抓取一個類而後直接使用它們。對象

  固然,在使用以前,咱們須要作一個簡單的配置,把你未來須要使用的類所有告訴ioc容器,例如Jdon框架的ioc容器配置jdonframework.xml以下:

<app>
  <services>
    <pojoService name="b" class="test.B"/>
    <pojoService name="a" class="test.A"/>
    <pojoService name="c" class="test.C"/>

  </services>
</app>

  注意:雖然B類代碼調用了A類(甚至可能調用C等其餘類),可是在配置中咱們無需考慮這種調用關係。所以,整個環節咱們都無需考慮B類中涉及其餘類的調用關係;這樣是很是省時省力的;特別是若是項目較大,JavaBeans特別多,又是多人協調開發,這種方式對提升開發效率;下降出錯率是很是大的幫助

  若是你的項目中有很是多的類;調用關係很複雜,並且調用關係隨時均可能變化,那麼,使用無需照顧調用關係的Ioc容器無疑是減輕開發負擔的首選。

  ioc容器另一個著名實現是Spring框架,可是在Spring的配置文件applicationContext.xml中,咱們必須考慮上述調用關係:

<bean id="b" class="test.B">
  <property name="a"><ref bean="a"/></property><!-- 必須指定調用關係 --> 
  ....
</bean>
<bean id="a" class="test.A">
<bean id="c" class="test.C">

2. 缺點

IoC最大的缺點是什麼?

  1. 生成一個對象的步驟變複雜了(其實上操做上仍是挺簡單的),對於不習慣這種方式的人,會以爲有些彆扭和不直觀。
  2. 對象 生成由於是使用反射編程,在效率上有些損耗。但相對於IoC提升的維護性和靈活性來講,這點損耗是微不足道的,除非某對象的生成對效率要求特別高。

轉自:http://www.jdon.com/AOPdesign/iocimpls.htm

相關文章
相關標籤/搜索