思想引入

假设一个系统原先只设定有一个默认的方法去完成业务,这里举例这个原先设定开发的是 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 控制反转的更多相关文章

  1. 基于SqlSugar的开发框架循序渐进介绍(5)-- 在服务层使用接口注入方式实现IOC控制反转

    在前面随笔,我们介绍过这个基于SqlSugar的开发框架,我们区分Interface.Modal.Service三个目录来放置不同的内容,其中Modal是SqlSugar的映射实体,Interface ...

  2. 【转】跟我一起学Spring 3(4)–深入理解IoC(控制反转)和DI(依赖注入)

    在继续下面的章节之前,我们要先说说大名鼎鼎的IoC和DI. 我们经常会听说IoC,也就是Inversion of Controller,控制反转.事实上,IoC并不是一个新鲜的概念,最早可能是在198 ...

  3. 谈谈php里的IOC控制反转,DI依赖注入

    理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(In ...

  4. 谈谈php里的IOC控制反转,DI依赖注入(转)

    转自:http://www.cnblogs.com/qq120848369/p/6129483.html 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和" ...

  5. Spring IOC - 控制反转(依赖注入) - 入门案例 - 获取对象的方式 - 别名标签

    1. IOC - 控制反转(依赖注入) 所谓的IOC称之为控制反转,简单来说就是将对象的创建的权利及对象的生命周期的管理过程交 由Spring框架来处理,从此在开发过程中不再需要关注对象的创建和生命周 ...

  6. C#代码实现IoC(控制反转)设计,以及我对IoC的理解

    一. 什么是IoC 当在A类中要使用B类的时候,我们一般都是采用new的方式来实例化B类,这样一来这两个类就有很强的依赖关系,不符合低耦合的设计思想.这时候我们可以通过一个中间容器来实例化对象,需要的 ...

  7. Spring框架之IOC(控制反转)

    [TOC] 第一章Spring框架简介 IOC(控制反转)和AOP(面向方面编程)作为Spring框架的两个核心,很好地实现了解耦合.所以,简单来说,Spring是一个轻量级的控制反转(IoC)和面向 ...

  8. IOC 控制反转(Inversion of Control,英文缩写为IoC)

    在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 在这样的齿轮组中,因为是协同工作,如果有一个齿轮出了问题,就可能会影响到整个齿 ...

  9. Spring Boot笔记十:IOC控制反转

    目录 IOC控制反转和DI依赖注入 IOC实现Hello World Spring IOC容器怎么知道哪些是管理的对象? IOC容器getBean方法的三种签名 xml配置文件的import导入 @A ...

随机推荐

  1. 删除mysql数据库后django重建数据库

    问题:由于表的结构设计的不太合理,后来要添加列,但是在django中使用makemigrations一直失败. 解决:索性就把mysql中对于django的数据库删了(其实也不用删除),在django ...

  2. ES6扩展——数组的新方法(Array.from、Array.of、Array.fill、Array.includes、keys values entries 、find)

    1.Array.from(objec,回调函数)将一个ArrayLike对象或者Iterable对象(类数组对象)转换成一个数组 1)该类数组对象必须具有length属性,用于指定数组的长度.如果没有 ...

  3. centos7 Tomcat 停止服务时报错: java.net.ConnectException: 拒绝连接 (Connection refused)

    2021-08-02 1.问题描述 配置完 server.xml 文件后,执行 shutdown.sh 脚本停止服务,出现以下错误 2. 解决方法 查看当前正在运行的 Java 进程号 # 找到 Ja ...

  4. C++回调机制

    一直对回调机制不是很了解,今天索性搜了很多资料顺便整理一下,进步一点点. 1.Callback方式(回调函数) 什么是回调函数? 简而言之,回调函数就是一个通过函数指针调用的函数.如果你把函数的指针( ...

  5. nios eclipse提示LED_PIO_BASE没有声明,怎么回事?

    这是因为名字不一致引起的比如,在生成SOPC系统时,双击PIO(Parallel I/O)(在Avalon Modules -> Other 下),为系统添加输出接口,你没有把该组件改名成LED ...

  6. 安装redis 6.0.6

    1.规划目录:下载目录.安装目录.redis数据目录mkdir -p /data/appmkdir -p /opt/redis_cluster/redis_6379/{conf,logs,pid}mk ...

  7. noip模拟43

    A. 第一题 儿子遍历顺序按深度由小到大即可 B. 第二题 二分最小值,以点权作为初始距离跑最长路即可 直接用大根堆跑 \(dij\) 会 \(T\),考虑初始权值可以处理,且边权一定,用类似蚯蚓的方 ...

  8. Python习题集(五)

    每天一习题,提升Python不是问题!!有更简洁的写法请评论告知我! https://www.cnblogs.com/poloyy/category/1676599.html 题目 打印99乘法表 解 ...

  9. java多线程 synchronized 与lock锁 实现线程安全

    如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 通过卖火车票的例子 火车站要卖票,我们模 ...

  10. JAVA安全基础之代理模式(一)

    JAVA安全基础之代理模式(一) 代理模式是java的一种很常用的设计模式,理解代理模式,在我们进行java代码审计时候是非常有帮助的. 静态代理 代理,或者称为 Proxy ,简单理解就是事情我不用 ...