首页 > 编程语言 >【编程底层思考】理解控制反转Inverse of Control,IOC 和 依赖注入Dependency Injection,DI,一体两面

【编程底层思考】理解控制反转Inverse of Control,IOC 和 依赖注入Dependency Injection,DI,一体两面

时间:2024-09-09 09:24:52浏览次数:13  
标签:Control Inverse Java 调用者 DI 对象 Spring 依赖 IOC

Rod Johnson是第一个高度重视以配置文件来管理Java实例的协作关系的人,他给这种方式起了一个名字:控制反转(Inverse of Control,IOC)。
后来Martine Fowler为这种方式起了另一个名称:依赖注入(Dependency Injection),因此不管是依赖注入,还是控制反转,其含义完全相同。
当某个Java对象(调用者)需要调用另一个Java对象(被依赖对象)的方法时,在传统模式下通常有两种做法:
1、原始做法: 调用者主动创建被依赖对象,然后再调用被依赖对象的方法。
2、简单工厂模式: 调用者先找到被依赖对象的工厂,然后主动通过工厂去获取被依赖对象,最后再调用被依赖对象的方法。
注意上面的主动二字,这必然会导致调用者与被依赖对象实现类的硬编码耦合,非常不利于项目升级的维护。
使用Spring框架后调用者无需主动获取被依赖对象,只要被动接受Spring容器为调用者的成员变量赋值即可。由此可见使用Spring后,调用者获取被依赖对象的方式由原来的主动获取,变成被动接受——所以Rod Johnson称之为控制反转。
另外从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量——相当于为调用者注入它依赖的实例,因此Martine Fowler称之为依赖注入。
可以看出,IOC和DI是看待一件事情的两个角度,一体两面,其本质是一样的。

标签:Control,Inverse,Java,调用者,DI,对象,Spring,依赖,IOC
From: https://blog.csdn.net/u010425839/article/details/142046174

相关文章

  • 【算法笔记】单源最短路问题——Dijkstra算法(无优化/优先队列/set优化)
    0.前言Dijkstra算法可在\(\mathcalO(m\logm)\)或\(\mathcalO(m\logn)\)的时间内求解无负权单源最短路问题。本文中,我们将详细介绍算法的原理、实现,以及常用的两种优化。另外,Dijkstra算法也不要乱用,比如说多源的最短路,用Dijkstra求解的复杂度只有\(\mathcalO(nm\logm)\),但......
  • Redis 分布式锁:实现与应用
    在分布式系统中,为了保证数据的一致性和并发控制,常常需要使用分布式锁。Redis作为一种高性能的内存数据库,提供了一些特性可以方便地实现分布式锁。今天,我们就来探讨一下如何用Redis实现分布式锁。一、分布式锁的基本概念分布式锁是一种用于在分布式系统中协调多个进程或线程对......
  • Redis 集群的实现方案全解析
    在当今大数据时代,Redis作为一款高性能的内存数据库,被广泛应用于各种场景。然而,随着数据量的不断增长和业务需求的日益复杂,单节点的Redis往往无法满足需求,这时就需要使用Redis集群来实现数据的分布式存储和高可用性。今天,我们就来一起探讨一下Redis集群的实现方案有哪些。一......
  • FL Studio24.1.1.4285最新中文破解版下载 2024年最新附带补丁器激活码
    嘿,亲爱的音乐制作小伙伴们!今天我要跟你们分享一款让我心动不已的神秘利器——FLStudio24.1.1.4285中文版。想象一下,一个全能的音乐工作站就像你口袋里的瑞士军刀,随时随地都能掏出来创造音乐奇迹!【功能介绍:一站式音乐制作解决方案】让我们来点名这款神器的超能力吧!FLSt......
  • Redis 实现延迟队列的巧妙方法
    今天我们来探索一下Redis是如何巧妙地实现延迟队列的,这可是在很多场景下都非常实用的技术哦!一、什么是延迟队列?延迟队列,简单来说,就是可以让消息在指定的延迟时间之后才被消费的队列。想象一下,你在网上订了一份外卖,商家并不会立即配送,而是根据你选择的送达时间,延迟一段时......
  • MATLAB实现Dijkstra算法和Floyd算法
    目录1、文件功能介绍2、代码执行效果展示3、Dijkstra算法求图的单源最短路径4、DijkstrafullPath的更新逻辑5、DIjkstra算法流程图6、Floyd算法实现图的任意两点间最短路径7、Floyd算法流程图8、FloydfullPath的更新逻辑(非递归算法)1、文件功能介绍代码文件功能wor......
  • Redis 入门 - 安装最全讲解(Windows、Linux、Docker)
    经过上一章节的介绍,相信大家对Redis已经有了大致的认知,今天主要给大家详细讲解Redis在Windows、Linux、Docker下的安装过程。01Windows下面给大家介绍三种在Windows环境下安装Redis的方式:官方建议方式、可执行文件方式、脚本方式。1、官方建议方式Redis官方是不支持直接......
  • Redis 入门 - 图形化管理工具如何选择,最全分类
    工欲善其事必先利其器,上一章Redis服务环境已经搭建完成,现在就需要一个趁手的工具,有个好工具可以做到事半功倍。Redis图形化管理工具五花八门,可供选择的很多,大家可以根据自己的需求应用场景进行选择。就是因为选择过多所以才写了这篇文章,和大家分享下到底有哪些工具可供选择,好给......
  • tkinter Text edit_undo()/edit_redo() 没反应解决方法
    问题tkinter.Text调用edit_undo()和edit_redo()没反应。问题分析这是因为没有设置Text的undo参数为True,设置后才能“激活”edit_undo()和edit_redo()。这个错误难发现是因为它没有报错,查了好多资料才发现……希望以后python官方能改进这点。解决方法fromtkinterimport*......
  • discuz3.4文件包含漏洞
    首先查看修复:可以看到新增代码preg_match("/^[\w-]+\.php$/i",$parse['path']))来验证path是否为php文件,这个应该是修复路径遍历导致的文件读取漏洞。还有require'./'.$_ENV['curapp'].'.php';这里应该是另外一个漏洞,因为$parse['path']和$_ENV['curapp'......