对Spring中ico的认识

IoC的全称是Inversion of Control,中文翻译反向控制或者逆向控制。这里的反向是相对EJB来讲的。EJB使用JNDI来查找需要的对象,是主动的,而Spring是把依赖的对象注入给相应的类(这里涉及到另外一个概念“依赖注入”),是被动的,所以称之为“反向”。先看一段代码,这里的区别就很容易理解了。

代码片断1:

public class Container 
{
    public void init()
    {
    Speaker s = new Speaker();
    Greeting g = new Greeting(s);
    }
}


代码片段2:

public void greet()
{
Speaker s = new Speaker();
s.sayHello();
}

代码片段3:

public void greet()
{
Speaker s = (Speaker)context.lookup("ejb/Speaker");
s.sayHello();
}

代码片段4:

public class Greeting 
{
    public Speaker s;
    public Greeting(Speaker s)
    {
        this.s = s;
    }
    public void greet()
    {
        s.sayHello();
    }
}

我们可以对比一下这三段代码。其中片段2是不用容器的编码,片段3是EJB编码,片段4是Spring编码。结合代码片段1,你能看出来Spring编码的优越之处吗?

这里我想先解释一下“依赖注入”。根据我给的例子可以看出,Greeting类依赖Speaker类。片段2和片段3都是主动的去获取Speaker,虽然获取的方式不同。但是片段4并没有去获取或者实例化Speaker类,而是在greeting函数中直接使用了s。你也许很容易就发现了,在构造函数中有一个s被注入(可能你平时用的是,传入)。在哪里注入的呢?请回头看一下代码片段1,这就是使用容器的好处,由容器来维护各个类之间的依赖关系(一般通过Setter来注入依赖,而不是构造函数,我这里是为了简化示例代码)。Greeting并不需要关心Speaker是哪里来的或是从哪里获得Speaker,只需要关注自己分内的事情,也就是让Speaker说一句问候的话。

控制反转的作用和目的就是应该将组件的配置与使用分离开,使其更具条理化,容易适应变化的环境,或者称为解耦合。

        组件与服务
      所谓“组件”是指这样一个软件单元:它将被作者无法控制的其他应用程序使用,但后者不能对组件进行修改。也就是说,使用一个组件的应用程序不能修改组件的源代码,但可以通过作者预留的某种途径对其进行扩展,以改变组件的行为。
       服务和组件有某种相似之处:它们都将被外部的应用程序使用。在我看来,两者之间最大的差异在于:组件是在本地使用的(例如JAR 文件、程序集、DLL、或者源码导入);而服务是要通过——同步或异步的——远程接口来远程使用的(例如web service、消息系统、RPC,或者socket)。
       这些轻量级容器则使用了更为灵活的办法,只要插件遵循一定的规则,一个独立的组装模块就能够将插件的具体实现“注射”到应用程序中,这种方法也就被称为依赖注入!
       Dependency Injection 模式的基本思想是:用一个单独的对象(装配器)来获得MovieFinder的一个合适的实现,并将其实例赋MovieLister 类的一个字段。
     依赖注入的形式有三种:分别将它们叫做构造子注入(Constructor Injection)、设值方法注入(Setter Injection)和接口注入(Interface Injection)。这三种注入形式分别就是type 1 IoC(接口注入)、type 2 IoC(设值方法注入)和type 3 IoC(构造子注入)

阅读更多
个人分类: J2EE
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭