思想引入

假设一个系统原先只设定有一个默认的方法去完成业务,这里举例这个原先设定开发的是 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. assign()与create()的区别

    Q:assign()与create()的区别? A:let obj = Object.assign(targetObj, -sourceObj) 作用:将一个或多个源对象自身的可枚举属性与目标对象的属 ...

  2. iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板

    写在前面   在文章"嵌入式Linux的CAN总线配置--基于迅为iTOP-4412开发板"中我给4412开发板配置了SPI转CAN模块,使用的是不带设备树的内核.在本篇文章中,要 ...

  3. Vs code添加自定义snippet

    Vs code添加自定义snippet(代码段) 前言 ​ 代码段能够帮助输入重复代码模式,在智能感知下可以帮我们快速补全代码,节省时间方便之余更利于代码格式的统一规范化. 1. Vs code代码段 ...

  4. MapperScannerConfigurer之sqlSessionFactoryBeanName注入方式

    Spring整合Mybatis时,项目启动时报错:(MapperScannerConfigurer之sqlSessionFactoryBeanName注入方式) pringframework.bean ...

  5. 异步处理方式之信号(一):基础知识和signal函数说明

    文章目录 1. 引言 2. 信号的概念 2.1 信号操作之忽略信号 2.2 信号操作之捕捉信号 2.3 信号操作之执行系统默认操作 2.4 常见的信号 3. 函数signal 3.1 signal函数 ...

  6. Spring5(六)——AspectJ(xml)

    一.AspectJ 1.介绍 AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,也可以说 AspectJ 是一个基于 Java 语言的 AOP 框架.通常我们在 ...

  7. vim中字符串的替换

    vi/vim 中可以使用 :s 命令来替换字符串 :s/vivian/sky/ 替换当前行第一个 vivian 为 sky :s/vivian/sky/g 替换当前行所有 vivian 为 sky : ...

  8. 【转】Gitlab CI & Docker & Dockerfile & Docker-compose的博客文章

    gitlab权限设置 GitLab功能系列报道-标签(Labels) Gitlab CI 使用高级技巧 docker-compose是个好东西,越用越香 基于docker-compose的Gitlab ...

  9. 基于swoole框架hyperf开发的纯API接口化的后台RBAC管理工具hyperfly@v1.0.0发布

    hyperfly@v1.0.0发布 本文地址http://yangjianyong.cn/?p=323转载无需经过作者本人授权 github地址:https://github.com/vankour/ ...

  10. phpstorm 配置Psr4 风格代码

    http://www.cnblogs.com/xp796/p/6441700.html