学习过spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解。首先要分享的一位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinnianshilongnian.iteye.com/blog/1413846。

1、IOC是什么

IOC—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:

谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IOC是有专门一个容器来创建这些对象,即由IOc容器来控制对象的创建而不再显式地使用new;谁控制谁?当然是IOC容器控制了对象;控制什么?那就是主要控制了外部资源获取和生命周期(不只是对象也包括文件等)。

为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

用图例说明一下,传统程序设计如图1,都是主动去创建相关对象然后再组合起来:

图1 传统应用程序结构图

当有了IOC的容器后,在客户端类中不再主动去创建这些对象了,程序的结构图变成如图2所示:

图2 有IOC容器后的程序结构图

2、IoC能做什么

IOC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IOC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

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

IOC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IOC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

3、IOC和DI

DI—Dependency Injection,即“依赖注入”:是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:

谁依赖于谁:当然是应用程序依赖于IOC容器;
为什么需要依赖:应用程序需要IOC容器来提供对象需要的外部资源;
谁注入谁:很明显是IOC容器注入应用程序某个对象,应用程序依赖的对象;
注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

IOC和DI有什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IOC而言,“依赖注入”明确描述了“被注入对象依赖IOC容器配置依赖对象”。

看过很多对Spring的Ioc理解的文章,好多人对Ioc和DI的解释都晦涩难懂,反正就是一种说不清,道不明的感觉,读完之后依然是一头雾水,看完这位技术牛人的博客后有一种豁然开朗的研究,他清楚地解释了IOC(控制反转) 和DI(依赖注入)中的每一个字,读完之后给人一种豁然开朗的感觉。我相信对于初学Spring框架的人对IOC的理解应该是有很大帮助的。

4、IOC和DI的意义

在平时的Java应用开发中,我们要实现某一个功能或者说是完成某个业务逻辑时至少需要两个或以上的对象来协作完成,在没有使用Spring的时候,每个对象在需要使用他的合作对象或者依赖对象时,自己均要使用像new object() 这样的语法来将合作对象创建出来,这个合作对象是由自己主动创建出来的,创建合作对象的主动权在自己手上,自己需要哪个合作对象,就主动去创建,创建合作对象的主动权和创建时机是由自己把控的,而这样就会使得对象间的耦合度高了,A对象需要使用合作对象B来共同完成一件事,A要使用B,那么A就对B产生了依赖,也就是A和B之间存在一种耦合关系,并且是紧密耦合在一起,而使用了Spring之后就不一样了,创建合作对象B的工作是由Spring来做的,Spring创建好B对象,然后存储到一个容器里面,当A对象需要使用B对象时,Spring就从存放对象的那个容器里面取出A要使用的那个B对象,然后交给A对象使用,至于Spring是如何创建那个对象,以及什么时候创建好对象的,A对象不需要关心这些细节问题(你是什么时候生的,怎么生出来的我可不关心,能帮我干活就行),A得到Spring给我们的对象B之后,两个人一起协作完成要完成的工作即可。

  所以控制反转IOC(Inversion of Control)是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了IOC容器,它就是一个专门用来创建对象的工厂,你要什么对象,它就给你什么对象,有了 IOC容器,依赖关系就变了,原先的依赖关系就没了,它们都依赖IOC容器了,通过IOC容器来建立它们之间的关系。
  DI(依赖注入)其实就是IOC的另外一种说法,DI是由Martin Fowler 在2004年初的一篇论文中首次提出的。他总结道:控制的什么被反转了?就是获得依赖对象的方式反转了。

对IOC和DI的通俗理解相关推荐

  1. IOC和DI浅显易懂的理解

    Bromon的blog上对IoC与DI浅显易懂的讲解 原文地址 1.IoC(控制反转) 首先想说说IoC(Inversion of Control,控制反转).这是spring的核心,贯穿始终.所谓I ...

  2. Spring IoC 和 AOP的通俗理解

    这篇文章会从下面从以下几个问题展开对 IoC & AOP 的解释 什么是 IoC? IoC 解决了什么问题? IoC 和 DI 的区别? 什么是 AOP? AOP 解决了什么问题? AOP 为 ...

  3. 深入理解IOC和DI的区别

    什么是IOC? 在Spring中最出名的两个概念莫过于IOC和AOP了吧,只要是学过Spring的人都知道,即使很出名,很多人也大概知道,那么面试的时候你是否能够说出来呢?相信很多人都对IOC和DI都 ...

  4. 深入理解DIP、IoC、DI以及IoC容器

    对于大部分小菜来说,当听到大牛们高谈DIP.IoC.DI以及IoC容器等名词时,有没有瞬间石化的感觉?其实,这些"高大上"的名词,理解起来也并不是那么的难,关键在于入门.只要我们入 ...

  5. 通俗理解Spring的IOC和AOP

    字面意思通俗理解: 参考Aop理解地址:https://blog.csdn.net/ios_xumin/article/details/78465782 参考IOC和DI理解地址:https://bl ...

  6. Spring IOC与DI、反射的理解 含小案例说明

    阅览了很多篇博文,对于Spring IOC和DI看到很多人介绍的感觉都很含糊,读完之后还是觉得混淆的不行,也有的人认为DI是IOC的另一种说法-emm,可能个人理解不同吧,我的观点并不然.但这种东西, ...

  7. Spring中IoC和DI的理解

    通常情况下,Spring是学习者学完se部分马上就要面对的一个轻量级框架.实际上,Spring框架功能很强大,而IoC和AOP是两个比较重要的知识点.经过我一段时间学习感到IoC要比AOP容易理解.今 ...

  8. 彻底理解Spring IOC和DI

    目录 前言 1. 分享Iteye的开涛对Ioc的精彩讲解 1.1 IoC是什么 1.2 IoC能做什么 1.3 IoC和DI 2. 分享Bromon的blog上对IoC与DI浅显易懂的讲解 2.1 I ...

  9. 互相引用 spring_巧夺天工,这样理解Spring的IOC、DI下来,真的很清晰了

    前言 你可能会有如下问题: 想看Spring源码,但是不知道应当如何入手去看,对整个Bean的流程没有概念,碰到相关问题也没有头绪如何下手 看过几遍源码,没办法彻底理解,没什么感觉,没过一阵子又忘了本 ...

最新文章

  1. TCP/IP协议族(一) HTTP简介、请求方法与响应状态码
  2. 【渝粤教育】国家开放大学2018年春季 0529-22T高级英语阅读(1) 参考试题
  3. html 鼠标图标做成动画效果,纯css3实现的鼠标悬停动画按钮
  4. 原创-WINDOWS SERVER 2008 WEB服务器安装配置
  5. Golang slice 的底层实现
  6. 二叉树的链表存储与遍历
  7. 智能一代云平台(三十七):Java技术栈
  8. 亚马逊ec2服务器上无法使用sudo执行npm命令的解决办法
  9. mac的rubywoo怎么读_macrubywoo是几号
  10. 缩进一个字符_韩语毕业论文排版之 学会悬挂缩进,不再天天敲空格!
  11. 星际争霸2Beta版单机使用方法
  12. 360免费wifi设置位置服务器,win10系统使用360免费wifi的操作方法
  13. 负数除以整数的余数怎么算?
  14. Lighttools 闪光灯仿真自建实例
  15. apache 2.4 httpd 2.4.6 反向代理后端的服务为HTTPS https 基于centos7
  16. IT服务管理标准化解决方案实践
  17. VSCode全套配置C++环境流程(完全卸载+C盘插件搬家+json配置文件+闪退问题+中文乱码问题)
  18. java计算机毕业设计扶贫平台MyBatis+系统+LW文档+源码+调试部署
  19. 深入浅出ModbusTcp
  20. 计算机房等电位连接,机房防静电地板等电位接地方案

热门文章

  1. AMD的双向田忌赛马:7nm中端CPU挑落顶级i9,旗舰GPU只对位NV三当家 | CES 2019
  2. 【11年华科计算机考研经验】追梦华中大-我的漫漫考研路
  3. 中文版-Because He Lives-因他活着-好消息诗班(音乐河2)
  4. 获取对话框当前cfont_MFC设置对话框、字体对话框、颜色对话框(转)
  5. Python爬虫爬取智联招聘职位信息
  6. 2021年中国电子商务行业投融资现状及未来发展趋势分析[图]
  7. 使用腾讯IP查询-判断IP归属地-Vic's blog
  8. Windows批处理命令快速获取文件夹下特定类型的文件名(2022.5.15)
  9. 艾科dell服务器系统安装教程,武汉swarm部署
  10. 职场上个人价值的三个驱动力