【转】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

相关文章
相关标签/搜索