控制反转(Inversion of Control)这个名字是什么意思?到底是谁的“控制权”被“反转”了?从前是谁控制?现在又是谁控制?

Spring控制反转(IoC)的理解 NULL 博文链接:https://hgxs-org.iteye.com/blog/1469237 立即下载

我们来一步步拆解这个问题。

到底是谁的“控制权”被“反转”了?

简单回答:是创建和管理对象的控制权被反转了。

再详细一点:是应用程序代码(我们自己写的业务代码)把对“依赖对象”的创建、查找和注入的控制权,“反转”或者说“交给了一个外部的容器(比如 Spring IoC 容器)。


从前是谁控制?(没有 IoC 的情况)

在没有 IoC 的世界里,我们自己的代码掌握着绝对的控制权。

让我们回到上一篇文章中那个 UserService 的例子:

public class UserService {
    // 我(UserService)需要一个 UserRepository。
    // 所以,我(UserService)自己来决定用哪个,并且自己来创建它!
    // 这就是“正向控制”或者说“传统控制”。
    private UserRepository userRepository = new MySqlUserRepository(); 

    public void doSomething() {
        // ...
    }
}

在这个场景下,控制链条是这样的:

  1. 谁是主控方?
    UserService。

  2. 它控制了什么?

    • 创建时机:当 new UserService() 被执行时,new MySqlUserRepository() 也立刻被执行。UserService 决定了 MySqlUserRepository 的出生时间。
    • 具体实现:UserService 在代码里写死了 MySqlUserRepository,它直接控制了依赖的具体类型。如果想换,必须改 UserService 的代码。
    • 生命周期:userRepository 实例的生命周期与 UserService 实例紧密绑定。UserService 实例被销毁时,userRepository 实例也会被回收。

总结一下:在传统模式下,一个对象如果需要依赖另一个对象,它必须亲自负责创建(或获取)这个依赖。这种主动、直接的控制方式,我们称之为“正向控制流”。


现在又是谁控制?(使用 IoC 的情况)

在使用了 IoC 之后,控制权从我们的业务代码,转移到了一个专门的“IoC 容器”手上。

我们再看 IoC 版本的代码:

@Service
public class UserService {
    // 我(UserService)只是声明:我需要一个 UserRepository。
    // 至于这个 UserRepository 是谁,从哪来,什么时候创建,我不管!
    // 我等着别人(IoC容器)把它送过来。
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void doSomething() {
        // ...
    }
}

在这个场景下,控制链条发生了“反转”:

  1. 谁是主控方?
    Spring IoC 容器。

  2. 它控制了什么?

    • 创建时机:容器在启动时,会扫描并创建所有被管理的 Bean(比如 MySqlUserRepository 的实例)。它不再是由 UserService 来决定。
    • 具体实现:容器根据配置(比如哪个类上标了 @Repository 注解)来决定实例化哪一个 UserRepository 的实现。UserService 完全不知道也不关心具体是 MySqlUserRepository 还是 MongoUserRepository。
    • 依赖注入:容器创建完 UserService 后,发现它需要一个 UserRepository,于是容器主动将自己管理的 UserRepository 实例,“注入”(送)给 UserService。UserService 从“主动索取”变成了“被动接收”。

总结:在 IoC 模式下,对象不再自己创建依赖,而是被动地等待容器将依赖注入进来。原来的主动方(UserService)变成了被动方,而容器则成为了新的主动方。这个主客关系的颠倒,就是“控制反转”这个名字的精髓。

比喻:“好莱坞原则”

IoC 的思想有一个非常著名的别称,叫做**“好莱坞原则”(The Hollywood Principle)**。

这句话是:“Don’t call us, we’ll call you.”(别来找我们,我们会来找你。)

  • 没有 IoC(你自己找工作):你(UserService)主动去给各个电影公司(new MySqlUserRepository(), new OracleUserRepository())打电话,询问是否有工作机会。你控制着整个过程。
  • 使用 IoC(你签约了经纪人):你(UserService)签约了一个顶级经纪人(Spring IoC 容器)。你只需要告诉经纪人:“我是一个演员,我需要角色(UserRepository)”。然后你就回家等着。当有合适的角色时,经纪人会主动打电话给你,把剧本(依赖实例)给你。

在这个比喻里:

  • 你(演员) 就是我们的业务组件,比如 UserService。
  • 经纪人 就是 IoC 容器。
  • 打电话这个动作的“控制权”,从你手上,反转到了经纪人手上。

这就是“控制反转”的全部意义:将组件之间复杂的创建和依赖关系,从组件内部代码中剥离出来,交由一个中立的第三方容器去统一管理,从而实现解耦和更高的灵活性。

蓝牙Channel Sounding为真正的距离感知赋能 1:工作原理蓝牙™信道探测使用两种经过验证的测距方法——PBR(PBR)和RTT(RTT),实现蓝牙设备之间的安全精密测距。 阅读详情

相关推荐

嵌入式系统启动流程解析:ROM Code、Bootloader与启动代码的协同工作

本文深入解析嵌入式系统从通电到运行的完整启动流程,详细阐述了ROM Code、Bootloader与启动代码三者如何像接力赛般协同工作。ROM Code作为芯片固化的初始引导程序,负责硬件自检并加载Bootloader;Bootloader作为系统总指挥,初始化关键硬件并加载操作系统内核;启动代码则为C语言运行环境铺平道路。理解这三者的分工与协作,是进行系统移植和解决启动问题的关键。

dd012的博客 553

什么是控制反转(Inversion of Control)

控制反转/Ioc = = 数清楚回调接口soooooort()中o的个数。除此之外,IoC没有任何其他含义。 在阅读[1.2.4抛弃DIP]、[1.3.3什么是好莱坞法则]、[2.2模板方法模式]和[3.2.3什么是依赖注入]时,回头看看本节。

yqj2065的博客 1万+

Dify+MCP 双剑合璧:告别知识库模糊统计,让AI精准查询数据库数据!

本文详细介绍了如何通过Dify和MCP的结合,解决知识库在数据库查询中的模糊统计问题。通过MCP中间件将自然语言实时转换为SQL语句,实现精准数据查询,并支持SSE协议持续更新数据。文章包含MySQL环境搭建、MCP服务端部署、Dify工作流配置等实战步骤,帮助用户高效构建智能数据库查询系统。

weixin_33737774的博客 368

浅谈控制反转(IoC)

Inversion of Control 什么是控制反转? 控制反转是指程序的流程控制权相对于传统的面向过程编程而言发生了反转。下面是维基百科的描述 In software engineering, inversion of control (IoC) is a programming principle. IoC inverts the flow of control as compared to traditional control flow. 看到这里大家可能会觉得云里雾里的…控制反转(Inve

米碎师兄 1万+

BurpSuite+安卓模拟器双保险:避开真机抓包限制的完整配置指南

本文详细介绍了如何通过BurpSuite与安卓模拟器(如雷电、夜神)协同工作,绕过真机抓包限制的完整配置指南。从环境准备、网络拓扑配置到证书部署和流量分析,提供了一套高效的解决方案,帮助安全测试人员稳定捕获手机数据包,提升测试效率。

Apple的专栏 436

从‘查理复用’到TM52F1363:深入剖析5脚188数码管的驱动原理与避坑指南

本文深入解析了5脚188数码管的驱动原理,重点介绍了查理复用技术如何通过5个IO引脚高效驱动188段显示,并详细探讨了TM52F1363单片机的寄存器配置与驱动实现。文章还提供了常见问题的解决方案和性能优化技巧,帮助开发者避免实际应用中的各种陷阱。

weixin_29159441的博客 477

什么是 Inversion of Control 控制反转

首先解释一下,本篇博客是对博主前两天研究的一篇博客的解释,这里附上这篇博客的链接,大家可以先看一下: Inversion of Control 控制反转 有什么好处 下面咱们进入正题 定义 首先我们看一下,我们需要关注的几个定义: 依赖倒置原则(Dependency Inversion Principle ) a.高层模块不应该依赖于底层模块,二者都应该依赖于抽象。 b.抽象不应该依赖于细节,细节应该依赖于抽象。 控制反转(Inversion of Control) 在*《精通Spring4.x 企业应用开

盖丽男 1031

量化策略分享之首板低开

这个量化策略的核心是选择在低位、首次涨停后次日低开的股票,开盘时买入,上午有盈利就卖出,没有就拿到尾盘在卖出;策略优点在于选择的股票在低位,风险较低,并且刚启动首板,有大资金介入,第二天能快速跑路。

qq_29301281的博客 1463

Inversion of Control (IOC)控制反转 有什么好处

要了解控制反转( Inversion of Control ), 我觉得有必要先了解软件设计的一个重要思想:依赖倒置原则(Dependency Inversion Principle )。 什么是依赖倒置原则?假设我们设计一辆汽车:先设计轮子,然后根据轮子大小设计底盘,接着根据底盘设计车身,最后根据车身设计好整个汽车。这里就出现了一个“依赖”关系:汽车依赖车身,车身依赖底盘,底盘依赖轮子。 这样的设计看起来没问题,但是可维护性却很低。假设设计完工之后,上司却突然说根据市场需求的变动,要我们把车子的轮子设

潘小蓝的博客 2744

YOLOv8实战火焰和烟雾检测 (视频教程)

本课程将手把手地教大家使用YOLOv8结合可变形卷积(deformable convolution)训练火焰和烟雾数据集,完成一个多目标检测实战项目,可实时检测图像、视频、摄像头和流媒体(http/rtsp)中火焰和烟雾,并提供可视化演示界面 。

bai666ai的博客 1914

利用AWVS进行反制

awvs 10.5下载 http://www.32r.com/soft/12986.html

渗透之路,攻防之间皆学问 6652

.net core IOC(控制反转)、DI(依赖注入)

文章目录一、什么是控制反转(Inversion of Control ,简称IOC)IOC代码层面解释:DI代码层面解释:二、为什么要使用IOC测试代码(耦合代码)三、IOC如何降低耦合情景再现:IOC实现原理四、 IOC模式中的容器容器的解释.net core 自带容器的使用Autofac使用(第三方) 一、什么是控制反转(Inversion of Control ,简称IOC) 控制反转,是面向对象编程中的一种设计原则,可以减少代码之间的耦合度,其中最常见的方式叫做依赖注入(Dependency Inj

刘毅鹏的博客 4819

【异常】Cursor IDE 扩展主机超时错误处理文档The agent execution provider did not respond within 4 seconds.

该错误通常是 Cursor IDE 的临时性问题,不影响项目代码。大多数情况下,重新加载窗口或重启 IDE 即可解决。如果问题持续,可按上述进阶方案排查。重新加载窗口(最快)重启 IDE检查系统资源清理缓存检查扩展更多关于 AI+教育领域的干货,可以关注我的微信公众号第一时间获取哦~

奶爸的编程之路,也就一周冷个三天 2697

你确定懂?彻底搞懂 控制反转(IoC Inversion of Control )与依赖注入(DI Dependency Inversion Principle )

说明 Spring框架,核心就是IoC容器。要掌握Spring框架,就必须要理解控制反转的思想以及依赖注入的实现方式。下面,我们将围绕下面几个问题来探讨控制反转与依赖注入的关系以及在Spring中如何应用。 什么是控制反转? 什么是依赖注入? 它们之间有什么关系? 如何在Spring框架中应用依赖注入? 1. 控制反转 在讨论控制反转之前,我们先来看看软件系统中耦合的对象。 图1:软件系统中耦合的对象 从图中可以看到,软件中的对象就像齿轮一样,协同工作,但是互相耦合,一个零件不能正常工作,整个系统就崩溃了。

AI架构师易筋 4129

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

IOC(Inversion of Control 控制反转)

背景 我们知道在面向对象设计的软件系统中,它的底层都是由N个对象构成的,各个对象之间通过相互合作,最终实现系统地业务逻辑。 如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针、分针和秒针顺时针旋转,从而在表盘上产生正确的时间。图1中描述的就是这样的一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,协同工作,共同完成某项任务。我们可以看到,在这样的齿轮组中,...

Jeff_的博客 1013

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java控制反转_什么是控制反转(Inversion of Control)

【2019.6.20 最后编辑】要理解本文,请务必将实验1:框架设计者走一遍。(实验的改进BubbleSort的步骤二,)针对抽象类型编程,表示为SortTest→IntSort<=BubbleSort1.1.3控制反转现在聚焦SortTest,它是测试流程的控制模块。当应用程序员编写SortTest,他感觉一切都在他的(代码的)控制之下。也就是说,应用程序员决定控制模块SortTest要干...

weixin_35554306的博客 641

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

什么是控制反转(Inversion of Control)

ioc 目录 简介原理介绍 编辑本段简介 (Inversion of Control) 中文译为控制反转 IOC的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器负责将这些联系在一起。 编辑本段原理介绍 早在2004年,Martin Fowle...

weixin_33696822的博客 277

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

我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。 在这样的齿轮组中,因为是协同工作,如果有一个齿轮出了问题,就可能会影响到整个齿轮组的正常运转。 齿轮组中齿轮之间的啮合关系,与软件系统中对象之间的耦合关系非常相似。对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础。 架构师和设计师对于

6136

控制反转与依赖注入

转载自:天才卧龙 https://www.cnblogs.com/chenwolong/p/IOC.html 1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。 图1:软件系统中耦合的对象 如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针、分针和秒针顺时针旋转,从...

hhhhhhenrik的博客 1817

Inversion of Control(IOC)控制反转 & Dependency Injection(DI)依赖注入

转载自:https://www.cnblogs.com/DebugLZQ/archive/2013/06/05/3107957.html 博文目录 IOC的理论背景 什么是IOC IOC也叫依赖注入(DI) IOC的优缺点 IOC容器的技术剖析 IOC容器的一些产品 参考博文 本文旨在用语言(非代码)说清楚IOC到底是什么,没有什么高深的技术,园中的老牛、大虾们看到这里可以绕行了,以免浪费您宝贵的时间。IOC这个东西DebugLZQ早就想写了,但是出于对文章权威性的考虑(不能误人子弟- -!

wang_yong_zhang的博客 204

什么是控制反转(Inversion of Control)与依赖注入(Dependency Injection)

IoC(控制反转)和DI(依赖注入)是解耦代码的重要设计思想。IoC将对象创建控制权交给外部容器,DI是具体实现方式,通过构造函数、Setter或接口注入依赖。这种机制降低耦合度、提高可测试性、增强可维护性,并统一管理对象生命周期。核心区别在于:IoC是设计原则,DI是具体技术,二者共同实现"别人给"而非"自己造"的松耦合架构。

油墨香^-^的博客 502

控制反转容器&依赖注入模式(Inversion of Control Containers and the Dependency Injection pattern)

控制反转容器&amp;依赖注入模式Inversion of Control Containers and the Dependency Injection pattern作者:Martin Fowler翻译:坚强2002&amp;源文档 http://www.martinfowler.com/articles/injection.html​ 轻量级容器在Java社区近来可是风起云涌,这些容器能将来...

人生就是一个不断学习的过程 1032

IOC控制反转

一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。即软件系统中对象之间的耦合,对象A和对象B之间有关联,对象B又和对象C有依赖关系,这样对象和对象之间有着复杂的依赖关系,所以才有了控制反转这个理论。 2.什么是控制反转(IoC): (1).IoC是Inversion of Control的缩写,有的翻译成“控制反转”,还有翻译成为“控制反向”或者“控制倒置”。 (2).1996年,Mich

weixin_48732753的博客 197

PHP中的依赖注入(DI)和控制反转(IOC)实际使用案例

依赖注入和控制反转在业界算是顶顶大名了,其实还是有很大一部分人不知道吧,这个就是进阶高级工程师必学的理念,让你脱离简单的业务实现进阶中高级工程师。 关于这两个东西其实和爱情是一样的,感觉的到但是说不清道不明,一千个程序员就有一千个依赖注入和控制反转,每个人的理解都各有不同。其实他们简述的是一个东西,我是这么理解的,他们的代码实现其实相对比较简单,所以我们就从概念开始吧。 IoC,直观地讲,就...

qq_36733838的博客 354

Spring3之控制反转(IOC)

控制反转(Inversion of Control, 缩写为IoC), 是面向对象编程中的一种设计原则, 可以用来减低计算机代码之间的耦合度;其中最常见的方式叫做依赖注入(Dependency Injection, 简称DI), 还有一种方式叫 “赖查找” (Dependency Lookup);通过控制反转, 对象在被创建的时候, 由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它;也可以说, 依赖被注入到对象中。

少年闰土 401

什么是控制反转(或依赖注入)

控制反转(IoC=Inversion of Control)IoC,用白话来讲,就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:(依赖)控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。 IoC还有一个另外的名字:“依赖注入 (DI=Dependency Injection)” ,即由容器动态的将某种依赖关系注入到组件之中 ...

qfzhaohan的博客 934
上一篇: Excel 最常用的统计需求有哪些?
下一篇: Excel 如何根据某个条件进行判断,返回不同的结果?
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值