文档章节

浅析 Spring IoC - 基础概念

pradosoul
 pradosoul
发布于 2015/10/15 17:02
字数 1576
阅读 201
收藏 9

1. IoC是什么?

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

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

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

2. IoC 能做什么

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

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

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

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就是通过反射来实现注入的。

    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容器也注入不了任何东西,从而从根本上说“如何设计好类结构才是关键,依赖注入只是一种装配对象手段”。


本文转载自:http://jinnianshilongnian.iteye.com/blog/1413846

共有 人打赏支持
pradosoul
粉丝 6
博文 40
码字总数 37445
作品 0
闵行
程序员
Spring IoC(更新中)

概念 IoC(控制反转,也叫依赖注入DI)是Spring的核心,几乎Spring的所有组件都要建立在此基础之上,包括AOP,声明式事务,SpringMVC等等。那么IoC的主要目的是什么呢?两个字“解耦”。为什么...

互联网小龙虾
2014/03/04
0
0
【Spring学习笔记】--IOC学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YYZZHC999/article/details/82824751 spring ioc原理 Ioc—Inversion of Control,即“控制反转”,不是什么技...

Hepburn_Yang
09/23
0
0
三条路线告诉你如何掌握Spring IoC容器的核心原理

一、前言 前三篇已经从历史的角度和大家一起探讨了为什么会有Spring,Spring的两个核心概念:IoC和AOP的雏形,Spring的历史变迁和如今的生态帝国。本节的主要目的就是通过一个切入点带大家一...

Java小铺
08/27
0
0
浅析 Spring IoC - 注入方式

IoC 容器的概念 IoC 容器指 具有依赖注入功能的容器,IoC 容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需直接在代码中 new 相关对象,而是由 IoC 容器进行...

pradosoul
2015/10/19
266
0
使用 intellijIDEA 创建 maven 工程进行 Spring ioc 测试

使用 intellijIDEA 创建 maven 工程进行 Spring ioc 测试 ioc 概念 控制反转(Inversion of Control,缩写为IOC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其...

希希里之海
08/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

什么是集群、分布式、集中式、伪分布式

1. 集中式 将项目等部署到同一台机器上,对机器性能要求比较高,一般会用多台机器备份,否则,如果机器出现死机等状况,整个项目将不能运行。 eg:就好比你要盖一座房子,你房子就给一个人盖...

吴伟祥
36分钟前
0
0
微服务写的最全的一篇文章

今年有人提出了2018年微服务将疯狂至死,可见微服务的争论从未停止过。在这我将自己对微服务的理解整理了一下,希望对大家有所帮助。 1.什么是微服务 1)一组小的服务(大小没有特别的标准,...

Java烂猪皮
37分钟前
0
0
Java 并发编程原理

为什么要使用多线程? 通过多线程提高吞吐量 伸缩性比较好,可以增加 CPU 核心来提高程序性能 什么场景下使用多线程? 如:tomcat BIO Java 如何实现多线程? Thread、Runnable、ExecutorSer...

aelchao
52分钟前
2
0
谨慎的覆盖clone方法

说在前面 有些专家级程序员干脆从来不去覆盖clone方法,也从来不去调用它,除非拷贝数组。 其他方式 可以提供一个构造函数或者工厂去实现clone功能。 相比于clone,它们有如下优势: 不依赖于...

XuePeng77
53分钟前
1
0
什么是最适合云数据库的架构设计?

分布式数据库技术发展多年,但是在应用、业务的驱动下,分布式数据库的架构一直在不断发展和演进。 开源金融级分布式数据库SequoiaDB,经过6年的研发,坚持从零开始打造数据库核心引擎。在技...

巨杉数据库
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部