用最简单的方式理解 IoC 控制反转
思想引入
假设一个系统原先只设定有一个默认的方法去完成业务,这里举例这个原先设定开发的是 UserDaoImpl(可能有些牵强,但是不影响我们对逻辑的理解)这样一个业务。
后来有一天,需求变了,业务流程大改,这里举例改为 UerDaoOracleImpl,这时候我们可能需要修改 UserService中对Dao层的引用,即修改原理的UserDaoImpl为UerDaoOracleImpl。
再后来,用户需求又变了,比如来了个 UserDaoMysqlImpl,这时候可能有得修改代码了吧。
好吧,那改吧,但是呢又有一天产品经理跑过来说改回原来的第一种,emmmm
示意图如下:

既然这样,和不把这个修改权丢给用户呢?要是能把这个修改权交给用户自由适用,那我们是不是可以把节省下来的时间拿去学新的技术了呢?是不是让用户感觉更好了呢?
就这样IOC思想来了!
IOC思想
IoC,Inversion of Control,控制反转,是一种设计思想。
即把对象的创建,从原来的由原来的程序自己控制,变成了向外转给第三方/用户/容器来根据需要自定义管理创建。
举个和代码不是很相关的例子,例如以前的网站几乎都是只有一种风格,网站管理者设计的是什么样用户看到的就是什么样,但是现在不一样了,不少网站支持用户根据自己的喜好随意切换风格、皮肤,这也是控制反转思想的一种应用吧。
IOC简单应用
好,现在就简单的应用 IoC 这种思想来改变上图这的逻辑吧。
假设我们这里的 UserController就是对外(用户)的接口,即别的人/系统回从这里开始调用我们的业务逻辑。
现在我们就在这里直接接入用户需求,例如接口使用方说用 UserDaoMysqlImpl,好,那你就自己new一个UserDaoMysqlImpl对象传入我的预留的接口就行呗。
再过两天接口调用者又想用 UerDaoOracleImpl 这套了,也行,你自己set进去一个UerDaoOracleImpl就能调用我对UerDaoOracleImpl这套业务的支持了。
就这样,IoC 思想用上了,使用的人能按照自己的意思来了,我们也节省力气了。
示意图如下:

好了,到这里对IOC思想我们已经有了解了,那么Spring这个家伙又是怎么把IOC这种思想完美的应用了呢?
下一篇探讨:
用最简单的方式理解 IoC 控制反转的更多相关文章
- 基于SqlSugar的开发框架循序渐进介绍(5)-- 在服务层使用接口注入方式实现IOC控制反转
在前面随笔,我们介绍过这个基于SqlSugar的开发框架,我们区分Interface.Modal.Service三个目录来放置不同的内容,其中Modal是SqlSugar的映射实体,Interface ...
- 【转】跟我一起学Spring 3(4)–深入理解IoC(控制反转)和DI(依赖注入)
在继续下面的章节之前,我们要先说说大名鼎鼎的IoC和DI. 我们经常会听说IoC,也就是Inversion of Controller,控制反转.事实上,IoC并不是一个新鲜的概念,最早可能是在198 ...
- 谈谈php里的IOC控制反转,DI依赖注入
理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(In ...
- 谈谈php里的IOC控制反转,DI依赖注入(转)
转自:http://www.cnblogs.com/qq120848369/p/6129483.html 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和" ...
- Spring IOC - 控制反转(依赖注入) - 入门案例 - 获取对象的方式 - 别名标签
1. IOC - 控制反转(依赖注入) 所谓的IOC称之为控制反转,简单来说就是将对象的创建的权利及对象的生命周期的管理过程交 由Spring框架来处理,从此在开发过程中不再需要关注对象的创建和生命周 ...
- C#代码实现IoC(控制反转)设计,以及我对IoC的理解
一. 什么是IoC 当在A类中要使用B类的时候,我们一般都是采用new的方式来实例化B类,这样一来这两个类就有很强的依赖关系,不符合低耦合的设计思想.这时候我们可以通过一个中间容器来实例化对象,需要的 ...
- Spring框架之IOC(控制反转)
[TOC] 第一章Spring框架简介 IOC(控制反转)和AOP(面向方面编程)作为Spring框架的两个核心,很好地实现了解耦合.所以,简单来说,Spring是一个轻量级的控制反转(IoC)和面向 ...
- IOC 控制反转(Inversion of Control,英文缩写为IoC)
在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 在这样的齿轮组中,因为是协同工作,如果有一个齿轮出了问题,就可能会影响到整个齿 ...
- Spring Boot笔记十:IOC控制反转
目录 IOC控制反转和DI依赖注入 IOC实现Hello World Spring IOC容器怎么知道哪些是管理的对象? IOC容器getBean方法的三种签名 xml配置文件的import导入 @A ...
随机推荐
- Mysql 5.6 编译报错
编译安装 mysql(下面是编译参数) /usr/local/bin/cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.36 \ -DMYSQ ...
- Qt5之反射机制(内省)
Qt的元对象系统除了提供信号/槽机制的特性之外,它还提供了以下特性: QObject::metaObject() 返回关联的元对象 QMetaObject::className() 在运行时状态下返回 ...
- docker run命令指定GPU多个显卡不生效的问题解决和代码示例
问题描述:我有一个程序(app),需要用到显卡来跑.原本的部署方式 是直接修改程序的配置文件来指定要用到的显卡. 这是我服务器的显卡信息:总共3卡 分别是 0卡 ,1卡和2卡. [root@k8s-r ...
- EFCore 开始
1. 数据准备 新建类库项目--实体 NuGet安装: Microsoft.EntityFrameworkCore 新建类库项目--DbContext NuGet安装: Microsoft.Entit ...
- Java基础之类加载器
Java类加载器是用户程序和JVM虚拟机之间的桥梁,在Java程序中起了至关重要的作用,理解它有利于我们写出更优雅的程序.本文首先介绍了Java虚拟机加载程序的过程,简述了Java类加载器的加载方式( ...
- Python习题集(十一)
每天一习题,提升Python不是问题!!有更简洁的写法请评论告知我! https://www.cnblogs.com/poloyy/category/1676599.html 题目 如果一个正整数等于 ...
- openswan发送状态机分析
openswan发送状态机分析 1. 函数调用关系 2. 函数说明 如果按用户空间.内核空间划分的话,此部分代码更多是运行在内核空间的. 2.1 ipsec_tunnel_init_devices() ...
- vim的配置文件
网上一个比较常见的配置文件设置如下,这个配置还是很棒的,尤其创建脚本或者c文件时 " All system-wide defaults are set in $VIMRUNTIME/debi ...
- jq给动态标签绑定事件
$(document).on("click", ".autocompleteDiv .autocomplete_ul li", function () { lo ...
- Markdown时序图--基础语法
时序图 序列图是一种交互图,它显示了流程以何种顺序相互操作. Mermaid可以渲染序列图,如下定义. sequenceDiagram Alice->>John:Message Hel ...