java spring学习总结(一)Ioc基本概念

最近在学习spring相关的知识点,推荐比较多的便是这本《spring 揭秘》,一边看一边做记录吧,以便反刍。

Don’t call us, we will call you

Ioc(Inversion of Control),控制反转.被翻译的比较多的另一个名字是依赖注入。正如标题名所言,Ioc的精华就在于此。

通常我需要依赖某个对象或服务时,最简单的方式便是在类的构造函数里直接新建相应的依赖类.好比是造新房时需要家具,我们直接打造一个出来。
是回头想想,我们自己每次用到什么依赖对象都要主动地去获取,这是否真的必要?我们最终所要做的,其实就是直接调用依赖对象所提供的某项服务而已。只要用到这个依赖对象的时候,它能够准备就绪,我们完全可以不管这个对象是自己找来的还是别人送过来的。

这里就引入了依赖注入的关系。被注入者会直接依赖于被依赖对象。通过Ioc Service Provider来统一管理两者的关系。从被注入对象的角度看,与之前直接寻求依赖对象相比,依赖对象的取得方式发生了反转。

三种注入方式

在Martin Fowler的那篇文章“Inversion of Control Containers andthe Dependency Injection pattern”中, 提到了三种依赖注入的方式,即构造方法注入(constructor
injection)、 setter方法注入(setter injection)以及接口注入(interface injection)。

构造方法注入,顾名思义,即在对象的构造方法时编带入依赖对象,这种注入方式比较直观,不会重复,且伴随整个生命周期,对象被构造完成后,即进入就绪状态,可以马上使用。但缺点就是在依赖的对象比较多的时候,构造方法参数的处理会比较困难,维护和使用比较困难。

setter方法注入,即在让对象构造完成后即可使用,但相对来说更宽松一些,可以在对象构造完成后再调用setter方法注入。有点事setter方法可以被继承,允许设置默认值,而且有良好的IDE支持。

接口注入,通过接口来依赖注入依赖对象。通过方法来将依赖的对象注入。这种方式的注入强制注入了不必要的接口,带有入侵性。而构造方法和setter方法注入则不需要如此。

Ioc的附加值

使用Ioc的方式,不只是一个方向上的改变,不会对业务对象构成比较强的入侵性,使用Ioc模式之后,对象具有更好的可测试性、可重用性和可拓展性等。当需要新加依赖对象的时候,便体现出了可重用性。并且在编写测试案例时也非常的方便。Ioc是一种可以帮助我们解耦各业务对象依赖关系的对象绑定方式。