2.1.1  IoC是什么

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

●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

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

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

图2-1 传统应用程序示意图

当有了IoC/DI的容器后,在客户端类中不再主动去创建这些对象了,如图2-2所示:

图2-2有IoC/DI容器后程序结构示意图

1.1.2  IoC能做什么

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

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

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

2.1.3  IoC和DI

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

理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:

●谁依赖于谁:当然是某个容器管理对象依赖于IoC容器;“被注入对象的对象”依赖于“依赖对象”;

●为什么需要依赖:容器管理对象需要IoC容器来提供对象需要的外部资源;

●谁注入谁:很明显是IoC容器注入某个对象,也就是注入“依赖对象”;

●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

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

注:如果想要更加深入的了解IoC和DI,请参考大师级人物Martin Fowler的一篇经典文章《Inversion of Control Containers and the Dependency Injection pattern》,原文地址:http://www.martinfowler.com/articles/injection.html。

转自私塾在线【http://***/forum/blogPost/list/2427.html】

转载于:https://www.cnblogs.com/kaitao/archive/2012/02/21/2361653.html

【第二章】 IoC 之 2.1 IoC基础 ——跟我学Spring3相关推荐

  1. 【ArcGIS遇上Python】从入门到精通系列之第二章:ArcGIS Python基本语法基础速递

    Python的语法和其它编程语言的语法有所不同,编写Python程序之前需要对语法有所了解,才能编写规范的Python程序.本篇介绍Python标识符的同时,也讨论了Python变量的声明和赋值.通过 ...

  2. 萌新向Python数据分析及数据挖掘 第二章 pandas 第一节 pandas使用基础QA 1-15

    这是油管上的一个帅哥的网课地址如下 https://www.youtube.com/watch?v=yzIMircGU5I&list=PL5-da3qGB5ICCsgW1MxlZ0Hq8LL5 ...

  3. 传热学环肋肋效率matlab程序,传热学 第二章第四节 通过肋片的导热.pdf

    传热学 第二章第四节 通过肋片的导热 第四节 通过肋片的导热 第二章 导热基本定律及稳态导热 传热 学 第一节 导热基本定律 (Heat Transfer ) 第二节 导热微分方程式 (Heat Tr ...

  4. 《Java Web程序设计任务教程》简要复盘:第二章 JavaWeb概述

    <Java Web程序设计任务教程>简要复盘:第二章 JavaWeb概述 第二章:Java Web概述 XML基础 XML概述 XML语法 HTTP协议 1.HTTP概述 HTTP介绍 W ...

  5. 云计算技术与应用课后答案第二章

    第二章 云标准 1.云基础架构的融合部署分为三个层次的融合,它们是: (BCD) A.应用层的融合 B.硬件层的融合 C.业务层的融合 D.管理层的融合 2.下列关于云计算与SOA(面向服务的体系结构 ...

  6. c语言从键盘输入千米数,第二章 C语言编程基础.ppt

    第二章 C语言编程基础 习题2 P51-7.8.13.14.16 2.4.8break 语句和continue语句 [例2.19] 输出100 - 200 之间不能被3整除的数. P44 2.4.9循 ...

  7. 工程数据计算机处理的方法有,第二章 CADCAM技术基础-工程数据的计算机处理2011.ppt...

    文档介绍: CAD/CAM技术基础 CAD/CAM Technology Base 主讲人:XXX E-mail:XXX 第二章 工程数据的计算机处理 Computer Processing of E ...

  8. 训练指南第二章-基础问题

    训练指南第二章-基础问题 P170 2 / 4 Problem A UVA 10943 How do you add? 1 / 2 Problem B UVA 10780 Again Prime? N ...

  9. 鸟哥的Linux私房菜(基础篇)-第二章、 Linux 如何学习(二.3. 有心朝Linux作业系统学习者的学习态度)

    第二章. Linux 如何学习 最近更新日期:2009/08/06 3. 有心朝Linux作业系统学习者的学习态度 3.1 从头学习Linux基础 3.2 选择一本易读的工具书 3.3 实作再实作 3 ...

最新文章

  1. SpringBoot 部署 Jar 文件,瘦身优化指南 !
  2. SAP WM初阶之IM层面货物移动后WM层面自动完成TO创建和确认
  3. 零基础学python需要多久-零基础学Python要多久
  4. Consul和ZooKeeper的区别
  5. etcd安装及go简单操作
  6. 使用SAP PI将CRM的Opportunity同步到C4C去
  7. 最少换乘(最短路+恶心的输入)acm寒假集训日记22/1/3 or 22/1/4
  8. 3-3 编程练习:jQuery键盘事件案例
  9. 计算机基础--操作系统基础
  10. 《编码规范和测试方法——C/C++版》作业 ·004——设计一个顺序表
  11. vb 饼状图显示百分比_Matplotlib-饼图
  12. tsplay 打流,EasyICE测试
  13. bt709和srgb_选择用于多用途视频编辑和色彩校正的显示器— sRGB,DCI-P3,REC 709
  14. MATLAB 产生线性调频信号
  15. C语言移动营业厅程序设计,c语言实现移动电话系统
  16. 图解快速排序(C++实现)
  17. 什么是服务器?服务器有哪几种类型?
  18. 科学计算机如何进行复数运算,教你如何用你的卡西欧学生计算器进行复数运算!...
  19. 燕教授使用体验,从漱口水到牙膏
  20. 阿里云本地SSD型实例i2gne云服务器配置性能详解

热门文章

  1. 服务器不显示u盘,服务器不读u盘启动
  2. 米莱狄的机器人是_王者荣耀2.22更新:米莱狄机器人化身超级兵,狂铁将成T1级战士...
  3. php 插件 代码架构,php反射机制详以及插件架构实例详解
  4. java 基本类型 引用类型_Java中的基本类型和引用类型变量的区别
  5. 吸顶那个叫什么_为什么我家吸顶灯开灯后一闪一闪的
  6. 分布式理论:CAP、BASE | 分布式存储与一致性哈希
  7. redis排行榜之日排行周排行设计
  8. fastreport 上一行_创业天下全球总裁袁丽军一行莅临平川区 电商农特产扶贫展馆考察指导工作...
  9. Android SharedPreferences总结及优化
  10. 领域驱动设计:浅析 VO、DTO、DO、PO 概念、区别、用处