【第二章】 IoC 之 2.1 IoC基础 ——跟我学Spring3
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容器配置依赖对象”。
|
转自私塾在线【http://***/forum/blogPost/list/2427.html】
转载于:https://www.cnblogs.com/kaitao/archive/2012/02/21/2361653.html
【第二章】 IoC 之 2.1 IoC基础 ——跟我学Spring3相关推荐
- 【ArcGIS遇上Python】从入门到精通系列之第二章:ArcGIS Python基本语法基础速递
Python的语法和其它编程语言的语法有所不同,编写Python程序之前需要对语法有所了解,才能编写规范的Python程序.本篇介绍Python标识符的同时,也讨论了Python变量的声明和赋值.通过 ...
- 萌新向Python数据分析及数据挖掘 第二章 pandas 第一节 pandas使用基础QA 1-15
这是油管上的一个帅哥的网课地址如下 https://www.youtube.com/watch?v=yzIMircGU5I&list=PL5-da3qGB5ICCsgW1MxlZ0Hq8LL5 ...
- 传热学环肋肋效率matlab程序,传热学 第二章第四节 通过肋片的导热.pdf
传热学 第二章第四节 通过肋片的导热 第四节 通过肋片的导热 第二章 导热基本定律及稳态导热 传热 学 第一节 导热基本定律 (Heat Transfer ) 第二节 导热微分方程式 (Heat Tr ...
- 《Java Web程序设计任务教程》简要复盘:第二章 JavaWeb概述
<Java Web程序设计任务教程>简要复盘:第二章 JavaWeb概述 第二章:Java Web概述 XML基础 XML概述 XML语法 HTTP协议 1.HTTP概述 HTTP介绍 W ...
- 云计算技术与应用课后答案第二章
第二章 云标准 1.云基础架构的融合部署分为三个层次的融合,它们是: (BCD) A.应用层的融合 B.硬件层的融合 C.业务层的融合 D.管理层的融合 2.下列关于云计算与SOA(面向服务的体系结构 ...
- c语言从键盘输入千米数,第二章 C语言编程基础.ppt
第二章 C语言编程基础 习题2 P51-7.8.13.14.16 2.4.8break 语句和continue语句 [例2.19] 输出100 - 200 之间不能被3整除的数. P44 2.4.9循 ...
- 工程数据计算机处理的方法有,第二章 CADCAM技术基础-工程数据的计算机处理2011.ppt...
文档介绍: CAD/CAM技术基础 CAD/CAM Technology Base 主讲人:XXX E-mail:XXX 第二章 工程数据的计算机处理 Computer Processing of E ...
- 训练指南第二章-基础问题
训练指南第二章-基础问题 P170 2 / 4 Problem A UVA 10943 How do you add? 1 / 2 Problem B UVA 10780 Again Prime? N ...
- 鸟哥的Linux私房菜(基础篇)-第二章、 Linux 如何学习(二.3. 有心朝Linux作业系统学习者的学习态度)
第二章. Linux 如何学习 最近更新日期:2009/08/06 3. 有心朝Linux作业系统学习者的学习态度 3.1 从头学习Linux基础 3.2 选择一本易读的工具书 3.3 实作再实作 3 ...
最新文章
- SpringBoot 部署 Jar 文件,瘦身优化指南 !
- SAP WM初阶之IM层面货物移动后WM层面自动完成TO创建和确认
- 零基础学python需要多久-零基础学Python要多久
- Consul和ZooKeeper的区别
- etcd安装及go简单操作
- 使用SAP PI将CRM的Opportunity同步到C4C去
- 最少换乘(最短路+恶心的输入)acm寒假集训日记22/1/3 or 22/1/4
- 3-3 编程练习:jQuery键盘事件案例
- 计算机基础--操作系统基础
- 《编码规范和测试方法——C/C++版》作业 ·004——设计一个顺序表
- vb 饼状图显示百分比_Matplotlib-饼图
- tsplay 打流,EasyICE测试
- bt709和srgb_选择用于多用途视频编辑和色彩校正的显示器— sRGB,DCI-P3,REC 709
- MATLAB 产生线性调频信号
- C语言移动营业厅程序设计,c语言实现移动电话系统
- 图解快速排序(C++实现)
- 什么是服务器?服务器有哪几种类型?
- 科学计算机如何进行复数运算,教你如何用你的卡西欧学生计算器进行复数运算!...
- 燕教授使用体验,从漱口水到牙膏
- 阿里云本地SSD型实例i2gne云服务器配置性能详解
热门文章
- 服务器不显示u盘,服务器不读u盘启动
- 米莱狄的机器人是_王者荣耀2.22更新:米莱狄机器人化身超级兵,狂铁将成T1级战士...
- php 插件 代码架构,php反射机制详以及插件架构实例详解
- java 基本类型 引用类型_Java中的基本类型和引用类型变量的区别
- 吸顶那个叫什么_为什么我家吸顶灯开灯后一闪一闪的
- 分布式理论:CAP、BASE | 分布式存储与一致性哈希
- redis排行榜之日排行周排行设计
- fastreport 上一行_创业天下全球总裁袁丽军一行莅临平川区 电商农特产扶贫展馆考察指导工作...
- Android SharedPreferences总结及优化
- 领域驱动设计:浅析 VO、DTO、DO、PO 概念、区别、用处