IoC概述
---------------siwuxie095
IoC,即 Inversion of Control,控制反转,它是 Spring 容器的内核
AOP、声明式事务等功能都是在此基础上开花结果,即 都依赖于 IoC
IoC 涉及代码解耦、设计模式、代码优化等问题的考量
从以下三方面来深入了解 IoC:
· IoC 的初步理解
· IoC 的注入类型
· IoC 的注入方式
IoC 的初步理解
IoC 概念重要却比较晦涩难懂,通过如下实例来说明:
实例场景:电影《无间道》中刘德华所饰演的角色刘建明在天台的对白
即:电影:无间道--->角色:刘建明--->演员:刘德华
在传统的编程模式中,是剧本和演员直接耦合,即 剧本直接指定刘德华来表演

显然,在以上剧本中,作为具体角色饰演的刘德华直接侵入到
剧本中,使剧本和演员直接耦合在了一起
一个明智的编剧,在剧情创作时,应该围绕故事的角色来进行,
而不应该考虑角色具体的饰演者,这样才能在剧本投拍时,自
由的选择演员,而并非绑定在刘德华一个人身上
通过以上分析,发现需要为主人公刘建明(角色)定义一个接口

引入剧本角色刘建明。剧本情节就通过角色来展开,在拍摄时,
角色由演员来饰演,就如上图中无间道、刘建明、和刘德华三
者之间的关系
在上图中,无间道同时依赖刘建明和刘德华,
并没有达到期望:剧本仅依赖于角色
但角色必须通过具体的演员才能拍摄完成,如何让刘德华和剧本
无关,又能完成刘建明的具体动作呢?可以引入导演
在引入导演之后,剧本和饰演者完全解耦

首先,建立一个导演类,然后导演选择一个剧本:无间道,同时为剧本指定
一个角色:刘建明,让刘建明插入到无间道中,最后让刘德华来饰演刘建明
通过引入导演,使剧本和具体的饰演者彻底解耦。对应到软件中,导演就像
是一个装配器,它来安排演员表演具体角色
IoC 的概念:IoC 从字面上看,就是 控制 和 反转
到底是什么东西的控制被反转了?对应到前面的实例:
"控制" 是指选择刘建明角色扮演者的控制权,而 "反转" 是指这种
控制权,从无间道剧本中移除,转交到导演手中
对于软件来说,即 某一个接口的具体实现类的控制权,从调用类
中移除,转交给第三方决定
因为 IoC 确实不够开门见山,因此业界曾进行了广泛的讨论,最终
软件界的泰斗级人物 Martin Fowler 提出了 DI 的概念用以代替 IoC
即 让调用类对某一接口实现类的依赖关系由第三方(容器 或 协作类)
注入,以移除调用类对某一接口实现类的依赖
"依赖注入" 这个名词显然比 "控制反转" 直接明了、易于理解
DI,即 Dependency Injection
IoC 的注入类型
从注入方法上看,主要划分为三种类型:
· 构造函数注入
· 属性注入
· 接口注入
(1)构造函数注入:
通过调用类的构造函数,将接口实现类通过构造函数变量传入
如:WuJianDao 即调用类,LiuJianming 即接口,LiuDehua 即接口实现类


(2)属性注入:
通过 Setter 方法完成调用类所需依赖的注入,更加灵活方便
如:虽然刘建明是无间道的第一主角,但并非每个场景都需要刘建明出现,
在这种情况下,通过构造函数注入并不妥当,这时可以使用属性注入


(3)接口注入:
将调用类所有依赖注入的方法抽取到一个接口中,调用类通过实现该接口提供相应的注入方法
如:ActorArrange 即接口,调用类 WuJianDao 实现该接口



由于通过接口注入需要额外声明一个接口,这无疑增加了类的数目,
而且效果和属性注入并无本质区别,因此不提倡采用这种方式
虽然 WuJianDao 和 LiuDehua 实现了解耦, WuJianDao 无需关注
角色实现类的实例化工作,但这些工作在代码中依然存在,只是转移
到 Director 类中而已
假设某一制片人想改变这一局面,在选择某个剧本后,希望通过一个
媒体海选 或 第三方中介机构 来选择导演、演员,让他们各司其职,
那剧本、导演、演员就都实现了解耦
所谓 媒体海选 和 第三方中介机构,在程序领域即是一个第三方的容器,
它帮助完成类的初始化与装配工作,让开发者从这些底层实现类的实例
化、依赖关系装配等工作中脱离出来,专注于更有意义的业务逻辑开发
工作,这无疑是一件令人向往的事情,Spring 就是这么一个容器
IoC 的注入方式
Spring 作为一个容器,通过 配置文件 或 注解 描述类和类之间的
依赖关系,自动完成类的初始化和依赖注入的工作
下面是对以上实例进行配置的配置文件片段:

通过 new XmlBeanFactory("xxx.xml") 等方式即可加载(导入)配置文件
并同时启动 IoC 容器
在容器启动时,Spring 根据配置文件的描述信息,自动实例化 Bean 并完成
依赖关系的装配,从容器中即可返回准备就绪的 Bean 实例,后续可直接使用
Spring 为什么会有这种神奇的力量,仅凭一个简单的配置文件,就能魔法般
地实例化并装配好程序所用的 Bean 呢?
这种神奇的力量归功于 Java 语言本身的类反射功能
【made by siwuxie095】
IoC概述的更多相关文章
- Spring IOC 概述
Spring IOC 概述 IOC(Inversion of Control) 控制反转,也叫 DI(D_ependency injection_) 依赖注入.是一种设计思想.不过我并不同意所谓反转的 ...
- Spring框架学习-Spring和IOC概述
一:什么是Spring框架? spring是一个分层的javase/EEfull-stack(一站式)轻量级的java开源框架.是为了解决企业开发的复杂性而创建的.框架的主要优势是分层架构,Sprin ...
- 【Spring】IoC概述
Spring框架的核心概念--IoC IoC IoC是Inversion of Control的简写,翻译成汉语就是"控制反转".IoC并不是一门技术,而是一种设计思想,在Spri ...
- 一、Spring——IoC
IOC概述 Spring中IOC的概念,控制反转概念其实包含两个层面的意思,"控制"是接口实现类的选择控制权:而"反转"是指这种选择控制权从调用者转移到外部第三 ...
- Spring 源码剖析IOC容器(一)概览
目录 一.容器概述 二.核心类源码解读 三.模拟容器获取Bean ======================= 一.容器概述 spring IOC控制反转,又称为DI依赖注入:大体是先初始化bean ...
- Spring(2)——Spring IoC 详解
Spring IoC 概述 IoC:Inverse of Control(控制反转) 读作"反转控制",更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控 ...
- 【深入spring】IoC容器的实现
本文乃学习整理参考而来 IoC概述: 在spring中,IoC容器实现了依赖控制反转,它可以再对象生成或初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入方法调用的依赖 ...
- Spring IOC(一)概览
Spring ioc源码解析这一系列文章会比较枯燥,但是只要坚持下去,总会有收获,一回生二回熟,没有第一次,哪有下一次... 本系列目录: Spring IOC(一)概览 Spring IOC(二)容 ...
- Spring IoC的概念
Spring IoC的基础知识 Spring 框架可以说是Java世界中最成功的框架,它的成功来自于理念,而不是技术,它最核心的理念是IoC(控制反转)和AOP(面向切面编程),其中IoC是Sprin ...
随机推荐
- rails 字符串 转化为 html
simple_format http://apidock.com/rails/v4.0.2/ActionView/Helpers/TextHelper/simple_format http://api ...
- rails member collection
resources :theses do resources :document do get :download, :on => :member end end <a class=&qu ...
- ubuntu 部署的mysql无法远程链接
允许远程用户登录访问mysql的方法 从任何主机上使用root用户,密码:youpassword(你的root密码)连接到mysql服务器: # mysql -u root -proot mysql& ...
- HDU 1255 覆盖的面积 (线段树扫描线+面积交)
自己YY了一个的写法,不过时间复杂度太高了,网上的想法太6了 题意:给你一些矩阵,求出矩阵的面积并 首先按照x轴离散化线段到线段树上(因为是找连续区间,所以段建树更加好做). 然后我们可以想一下怎样 ...
- C++难点的一些总结
一. C++成员函数的重载 C++中的成员函数有四种,分别是普通成员函数,virtual虚函数,const成员函数. (1) void func(int a); (2) virtual void fu ...
- 爬虫第一篇:爬虫详解之urllib.request模块
我将urllib.request 的GET请求和POST请求两种方法做了总结 GET请求 GET请求爬取: import urllib.request import urllib.parse head ...
- 2013面试C++小结
2013年我在厦门c++求职小结 1.一般公司出的面试题目中的找错误,都是出自平常公司内部使用过程中出现的真实错误. 比如stl 中erase的使用:详细请见 :http://blog.csdn.ne ...
- Python基础-列表推导式
python中列表推导式有三种数据类型可用:列表,字典,集合 列表推导式书写形式: [表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件] 1,列表推导式 ...
- H264视频编码成MP4文件
firehood的专栏 Wince嵌入式开发 目录视图 摘要视图 订阅 赠书 | AI专栏(AI圣经!<深度学习>中文版) 每周荐书:Kotlin.分布式.Keras ...
- ES+open-falcon之报警自动发送请求信息
当我们监控nginx的状态码出现错误状态码的时候, 一般的处理方法是通过kibana查询是哪个接口导致从而确定是哪个服务,再进一步登录业务机器查询业务日志确定原因. 我们现在要做的事情就是将 人为的通 ...