第二章 Ioc的基本概念

来源:互联网 发布:java aop 日志记录 编辑:程序博客网 时间:2024/05/18 15:56

    Ioc是随着近年来轻量级容器(Lightweight Container)的兴起而逐渐被很多人提起的一个名词,它的全称为Inversion of Control,中文通常翻译为“控制反转”,它还有一个别名叫做依赖注入(Dependency Injection)。

    以前我们要获取一个对象都要通过new构造对象或者通过Service-Locator解决直接的依赖耦合,这都有一个共同点需要我们关注,那就是,我们都是自己去主动地去获取以来对象!而Ioc就是为了帮助我们避免之前的“大费周折”,而提供了更加轻松简洁的方式。它的反转,就是让你从原来的事必躬亲,转变为享受现在的服务。简单点说Ioc的理念就是让别人为你服务!

注入的几种方式

  • 构造方法注入
    • 顾名思义,构造方法注入,就是被注入的对象可以通过在其构造方法中声明以来对象的参数列表,让外部(通常是Ioc容器)知道它需要那些依赖对象。
    • public FxNewsProvider(IFXNewsListener newsListener,IFXNewsPersister newsPersister){this.newsListener = newsListener;this.newsPersister = newsPersister;}

Ioc Service Provider会检查被注入对象的构造方法,取得它所需要的依赖对象列表,进而为其注入相应的对象。同一个对象是不可能被构造两次的,因此,被注入的对象的构造乃至其整个生命周期,应该由Ioc Service Provider来管理。

    • 构造方法注入方式比较直观,对象被构造完毕后,即进入就绪状态,可以马上使用。
  • setter方法注入
    • 当前对象只要为其依赖对象所对应的属性添加setter方法,就可以通过setter方法将相应的以来对象设置到被依赖的对象中。
    • public class FXNewsProvider{private IFXNewsListener newsListener;private IFXNewPersister newPersister ;public IFXNewsListener getNewsListener() {return newsListener;}public void setNewsListener(IFXNewsListener newsListener) {this.newsListener = newsListener;}public IFXNewPersister getNewPersister() {return newPersister;}public void setNewPersister(IFXNewPersister newPersister) {this.newPersister = newPersister;}}

      这样用户就可以通过调用setter方法注入依赖对象了。
    • setter方法注入不像构造方法注入那样,让对象构造完成后就可以使用,但相对来说更轻松些,可以在对象注入完成后再注入。
  • 接口注入
    • 相对于前两种注入方式来说,接口注入就没有那么简单了。被注入的对象如果想要Ioc Service Provider为其注入依赖对象,就必须实现某个接口。这个接口提供一个方法,用来为其注入以来对象。Ioc Service Provider最终通过这些接口来了解应该为被注入对象注入什么依赖对象。

 三种注入方式的比较

  • 接口注入。从注入方式的使用上来说,接口注入是现在不甚提倡的一种方式,基本处于“退役状态”。因为它强制被注入的对象实现不必要的接口,带有侵入性。而构造方法注入和setter方法注入则不需要如此。
  • 构造方法注入。 这种注入方式的有点就是,对象在构造之后,即已进入就绪状态,可以马上使用。缺点是,当依赖的对象比较多时,构造参数方法的参数列表比较长。而通过反射构造对象的时候,对相同类型的参数的处理会比较困难,维护和使用上也比较麻烦。而且在Java中,构造方法无法被继承,无法设置默认值。对于非必须的依赖处理,可能需要引入多个构造方法,而参数数量上的变动可能造成维护上的不便
  • setter方法注入。 因为方法可以命名,所以setter方法注入在描述性上要比构造方法注入好一些。另外,setter方法可以被继承允许设置默认值,而且有良好的IDE支持。缺点当然就是对象无法在构造完成后马上进入就绪状态。

    综上所述,构造方法注入和setter方法注入因为其侵入性较弱,切易于理解和使用,所以是现在使用最多的注入方式;而接口注入因为侵入性较强,进来已经不流行了。

    Ioc是一种可以帮助我们解耦各业务对象间依赖关系的对象绑定方式