浅析 Spring IoC - 基础概念

1. IoC是什么?
html

    IoC(Inversion of Control)即控制反转,不是什么技术,而是一种设计思想。在Java开发中,IoC 意味着将你设计好的对象交给容器去控制,而不是传统的在对象内部直接控制(好比说 new 一个对象)。理解好 IoC 的关键是要明确“谁控制谁,控制什么,为什么是反转(有反转就应该有正转了),哪些方面反转了“:java

  • 谁控制谁,控制什么:传统Java SE 程序设计,咱们直接在对象内部经过 new 建立对象,是程序主动去建立依赖对象;而 IoC 是由 IoC容器来建立这些对象(在容器启动的时,容器会初始化 配置文件中定义的 bean,若是 bean 中添加参数 lazy-init="true" 则不会被建立对象); 谁控制谁?固然是 IoC容器控制对象。 控制什么? 主要控制了外部资源获取(不仅是对象,也包括文件等。。。)spring

  • 为什么是反转:传统Java SE 程序设计,咱们直接在对象内部经过 new 建立对象,是程序主动去建立依赖对象,也就是正转;而反转则是由容器来建立以及注入依赖对象。下面由两张图说明:数据库

2. IoC 能作什么
编程

    传统应用程序都是由咱们在类内部主动建立依赖对象,从而致使类与类之间高耦合,增长了维护难度;有了IoC容器后,把建立和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,因此对象与对象之间是松散耦合,利于功能复用,更重要的是使得程序的整个体系结构变得很是灵活。spa

    其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序本来是老大,要获取什么资源都是主动出击,可是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来建立并注入它所须要的资源了。设计

    简单的来讲:IoC 容器负责 实例化具体的 Bean,动态装配这些 Bean到相应的依赖对象中。htm

3. IoC 和 DI对象

    IoC的一个重点是:在系统运行过程当中,动态的向某个对象提供它所须要的其余对象,而这一点是经过DI(Denpendency Injection,即依赖注入)来实现的。IoC 和 DI 是同一个概念的不一样角度的描述。好比对象A须要操做数据库,之前咱们老是要在A中本身编写代码来得到一个Connection对象,有了 spring咱们就只须要告诉spring,A中须要一个Connection,至于这个Connection怎么构造,什么时候构造,A不须要知道。在系统运行时,spring会在适当的时候制造一个Connection,而后像打针同样,注射到A当中,这样就完成了对各个对象之间关系的控制。A须要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3以后一个重要特征是反射(reflection),它容许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是经过反射来实现注入的。blog

    DI 是由Martin Fowler 在2004年初的一篇论文中首次提出的。他总结:控制的什么被反转了?就是:得到依赖对象的方式反转了。

还有一篇讲解 IoC 容器的文章,很是不错:http://www.cnblogs.com/xdp-gacl/p/3707631.html,推荐给你们。。。

4. DI 的优势:

    (1)动态替换Bean依赖对象,程序更灵活:替换Bean依赖对象,无需修改源文件:应用依赖注入后,因为能够采用配置文件方式实现,从而能随时动态的替换Bean的依赖对象,无需修改java源文件;

    (2)更好实践面向接口编程,代码更清晰:在Bean中只需指定依赖对象的接口,接口定义依赖对象完成的功能,经过容器注入依赖实现;

    (3)更好实践优先使用对象组合,而不是类继承:由于IoC容器采用注入依赖,也就是组合对象,从而更好的实践对象组合。

    (4)采用对象组合,Bean的功能可能由几个依赖Bean的功能组合而成,其Bean自己可能只提供少量功能或根本无任何功能,所有委托给依赖Bean,对象组合具备动态性,能更方便的替换掉依赖Bean,从而改变Bean功能;

        而若是采用类继承,Bean没有依赖Bean,而是采用继承方式添加新功能,,并且功能是在编译时就肯定了,不具备动态性,并且采用类继承致使Bean与子Bean之间高度耦合,难以复用。

    (5)增长Bean可复用性:依赖于对象组合,Bean更可复用且复用更简单;

    (6)下降Bean之间耦合:因为咱们彻底采用面向接口编程,在代码中没有直接引用Bean依赖实现,所有引用接口,并且不会出现显示的建立依赖对象代码,并且这些依赖是由容器来注入,很容易替换依赖实现类,从而下降Bean与依赖之间耦合;

     (7)代码结构更清晰:要应用依赖注入,代码结构要按照规约方式进行书写,从而更好的应用一些最佳实践,所以代码结构更清晰。

    从以上咱们能够看出,其实依赖注入只是一种装配对象的手段,设计的类结构才是基础,若是设计的类结构不支持依赖注入,Spring IoC容器也注入不了任何东西,从而从根本上说“如何设计好类结构才是关键,依赖注入只是一种装配对象手段”。

相关文章
相关标签/搜索