【第二章】 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容器配置依赖对象”。

 

注:如果想要更加深入的了解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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462216.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

排队 题解 组合数学+高精度

因为实在是写不动了,所以菜鸡颓博客为了信奥发展的伟大未来作出一点小小的贡献 题目描述 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检。他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻&#xff0c…

在window下搭建TensorFlow

网站:https://blog.csdn.net/chduguxue/article/details/793922201.首先查看TensorFlow目前对Windows支持的python版本要求 https://pypi.python.org/pypi/tensorflow/1.1.0rc2截止本文2018年2月27日,要求python是3.5,操作系统64位 如果pytho…

i++与++i的区别,使用实例说明

/*** 类名&#xff1a;TEST.java<br>* <p>* 功能&#xff1a;i与i的区别,使用实例说明* </p>* * Author:<a href"mailto:llnyxxzj163.com">lilong</a> <br/>* Date:2013-5-20<br/>* Time:上午11:25:27 <br/>* Versi…

加减乘除

<script language"javascript">var x2y4document.write("加法:"(xy)"<br>");document.write("减法:"(y-x)"<br>");document.write("乘法:"(x*y)"<br>");document.write("…

Think in AngularJS:对比jQuery和AngularJS的不同思维模式

http://damoqiongqiu.iteye.com/blog/1926475转载于:https://blog.51cto.com/58script/1275438

Day 02 第二天课时总结

一 requests请求库爬取豆瓣电影信息 - 请求url https://movie.douban.com/top250 - 请求方式 GET - 请求头 user-agent cookies import requestsimport redef get_page(url): response requests.get(url) return responsedef parse_index(html): movie_list re.fin…

广播、组播、点播的区别

原网站:https://blog.csdn.net/z502521809/article/details/53007932 今天学习的时候发现了广播、组播、点播这三个用来描述网络节点之间通讯方式的术语&#xff0c;那么这几种“播”到底有什么区别&#xff1f;于是乎百度总结了一下。 ----------------------------------点播…

函数的加减乘除:

<script type"text/javascript">//函数的加法 function add(a,b) {return ab; } document.write(add(6,5))</script><script type"text/javascript">//函数的减法 function reduction(a,b) {return a-b; …

Arm架构下VUE环境的安装

最近因为项目需要在arm环境下搭建vue环境&#xff0c;网上有基于Linux的 教程&#xff0c;路径略有不同&#xff0c;现整理如下 1、安装文件下载 1、下载地址&#xff1a;http://nodejs.cn/download/ 2、选择一个合适的版本下载 2、安装步骤 1、将安装包上传到指定位置(我习惯放…

网络安全技术之端口隔离

端口隔离技术是一种实现在客户端的端口间的足够的隔离度以保证一个客户端不会收到另外一个客户端的流量的技术。通过端口隔离技术&#xff0c;用户可以将需要进行控制的端口加入到一个隔离组中&#xff0c;实现隔离组中的端口之间二层、三层数据的隔离&#xff0c;既增强了网络…

Javascript启动LINUX的x86模拟器

老外真是NB。我无话可说了。 http://bellard.org/jslinux/tech.html转载于:https://www.cnblogs.com/noevil/archive/2012/02/26/2369237.html

python解释器、pycharm安装及环境变量配置

python解释器、pycharm安装及环境变量配置 1.python解释器安装 下载地址&#xff1a;https://www.python.org/ 打开官网&#xff0c;点击downloads,选择操作系统&#xff0c;以windows为例&#xff1a; 选择python2与python3解释器版本&#xff08;以python3.6.6及python2.7.16…

RHEL6.4 Keepalive+LVS(DR)部署文档

1、简介LVSKeepalived 能实现的功能:利用 LVS 控制器主备模式避免单点故障以及自动删除故障 WEB 服务器结点并当它恢复后再自动添加到群集中。拓扑图:2、系统环境系统平台:RHEL6.4硬件平台:dell R720*4硬件参数:cpu(e5-2609)两颗;内存 32G;磁盘 600G*6;RAID 5 ;双电源LVS 版本:…

rtp 实时传输协议

实时传输协议&#xff08;Real-time Transport Protocol或简写RTP&#xff09;是一个网络传输协议&#xff0c;它是由IETF的多媒体传输工作小组1996年在RFC 1889中公布的。 国际电信联盟ITU-T也发布了自己的RTP文档&#xff0c;作为H.225.0&#xff0c;但是后来当IETF发布了关…

MySQL Cluster7.2.4 集群配置

准备 32位和64位版本 3台服务器 202.38.128.153 dbs2 64位 202.122.32.68 dbs1 64位 192.168.32.22 erpdbtest 32位 管理节点(ndb_mgmd) 192.168.32.22 erpdbtest 32位 数据节点(ndbd) 202.122.32.68 dbs1 64位 202.38.128.153 dbs2 64位 SQL节点(mysqld) 202.122.32.68…

非阻塞I/O多路复用机制

题外话&#xff1a;我们现在要仔细的说一说I/O多路复用机制&#xff0c;因为这个说法实在是太通俗了&#xff0c;通俗到一般人都不懂是什么意思。博主打一个比方&#xff1a;小曲在S城开了一家快递店&#xff0c;负责同城快送服务。小曲因为资金限制&#xff0c;雇佣了一批快递…

JAVA中toString方法的作用(转)

因为它是Object里面已经有了的方法&#xff0c;而所有类都是继承Object&#xff0c;所以“所有对象都有这个方法”。 它通常只是为了方便输出&#xff0c;比如System.out.println(xx)&#xff0c;括号里面的“xx”如果不是String类型的话&#xff0c;就自动调用xx的toString()方…

动态改变控件的方法

1.声明控件参数获取的对象 LinearLayout.LayoutParams linear (LayoutParams) view.getLayoutParams(); 2.设置控件参数&#xff0c;如宽度&#xff1a; linear.width 10&#xff1b; 3.使得设置生效 view.setLayoutParams(linear); 注意&#xff1a;view表示的是对应的控件对…

华为C语言笔试题集合

①华为笔试题搜集 1.static有什么用途&#xff1f;&#xff08;请至少说明两种&#xff09; 1)在函数体&#xff0c;一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2) 在模块内&#xff08;但在函数体外&#xff09;&#xff0c;一个被声明为静态的变量…

orcale中case when和group by同时使用会报无效标识符

不可以使用case when 的列名进行group by&#xff0c;如&#xff1a; select count(1)/7 as "平均违法数量", to_char(wfsj, yyyy-MM-dd ) as time, case when (to_char(wfsj, hh24)) between 00 and 04 then 00-04时 when (to_char(wfsj, hh24)) between 04 and 08 …