ioc和di的关系

2023-10-29

        刚进入spring的时候,看见这两个词一阵迷茫,控制反转不知道转的是啥,依赖注入也不知道注入的啥。有的人说这两个是一个,有的说di是ioc的实现,我就说说我的理解。

        从getter和setter开始

        从开始学习mvc设计模式,或者是jsp异或是框架,必然会有JavaBean或者其他类似的概念出现。getter和setter就是JavaBean中的重要部分,通过这种方式,不需要考虑依赖对象的创建过程,省去了内部出现new的情况,大大降低了耦合性。但是这种方式只是把底层的耦合性降低,依赖关系还是需要高层的Java程序将依赖对象注入。

        所以不满足的程序员提出了问题,耦合性的降低是否还可以更进一步?

        所以就有了ioc和di的出现,很多框架甚至是所有的框架,都实现了ioc的功能 ,spring也不例外而ioc和di的概念也紧随其后,做为spring的功能的解释。

之前一直错误的以为ioc和di是因为spring才出现的,实则不然,spring是一个良好的嵌入这两个功能的框架,但这两个功能或者说是思想,是因为需求才出现的,而框架是这些优良思想的具体实现和整合。

        ioc的出现

        ioc,inverse of control,控制反转。直接理解一下就是,将耦合关系的控制权力反转,或者说是将依赖注入的权力反转。本来依赖注入是谁控制的,Java类自己new对象。后来是高层对象创建后,用setter方法注入,而且还增加了高层对象对于依赖对象的维护。ioc的出现就极大的解决了这些问题,ioc容器接管了依赖注入的权力,全部由ioc容器来控制。这就是控制反转,由应用程序控制反转为ioc容器控制。其实,ioc的概念,已经不是仅仅程序的反转控制了,而是完全的外部资源控制。

        不过,还有一些问题。

        ioc的反转控制没错,但它还内涵了依赖注入的意思。可是字面上并没有体现,所以Martin Fowler 在2004年初的一篇论文中首次提出了di这一名词。

        di的出现

        di,dependency injection,依赖注入。di就是在指ioc容器内实现的将依赖对象注入的概念。而依赖注入这一概念的实现,必然也内涵着权力控制的条件,否则spring没有基础的控制权力,如何注入。

        总结

        ioc和di一个意思其实并没有错。ioc作为率先提出的概念内涵着一部分概念,不直接,有些难受,就提出了di。很有意思的是,他们都内涵着对方的意思。

        当然如果你要是强制认为,ioc就是容器,di就是注入这一行为,那么di确实就是ioc的具体功能的实现。而ioc则是di发挥的平台和空间。

        所以说,ioc和di即是相辅相成的搭档,又是殊途同归的双胞胎。最重要的是,他们都是良好的降低耦合的思想。

当然,随着技术的发展,两者的概念可能会越来越分离,各自形成一个独立的体系。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ioc和di的关系 的相关文章

随机推荐

  • vue——组件中的样式改变方法

    一般我们自己封装的组件或者组件库 element vant antdesign 中的样式在页面中必要的时候需要改变时 解决方法如下 解决方法 在页面中重新写一个 不要改成局部的 scope 页面中全局修改 在上一部的中 改变组件样式时 要先
  • 关于OpenAI的Gym中的step方法

    文章目录 导读 Gym的step方法 最后的话 导读 本文就只是关于step方法的参数与返回值的一个小小的学习笔记 这也是没有第一时间查官方文档而造成的时间消耗 所以 这篇博客就是逼自己查一下 Gym的step方法 既然都已经用pip下载了
  • whois命令简介

    whois命令简介 一 概述 whois是Linux Unix环境下的命令 按字面意思就是问 他是谁 通过对域名的检索 可以反馈回域名的注册信息 包括持有人 管理资料以及技术联络资料 也包括该域名的域名服务器 但是在世界上有几个主要的who
  • Contest2967 - 2022-2023-2 ACM集训队每周程序设计竞赛(1)

    问题 C 付哥题做不完了 内存限制 1024 MB时间限制 2 000 S评测方式 文本比较命题人 admin提交 323解决 44 返回比赛提交提交记录侧边提交 题目描述 付哥今天在做题 他有两个题单A和B 里面的题目数量分别为n和m 每
  • 数据库语法时用到的{},,[]等各类括号分别代表什么?

    lt gt 尖括号 用于分隔字符串 字符串为语法元素的名称 SQL语言的非终结符 定义操作符 用在生成规则中 分隔规则定义的元素和规则定义 被定义的元素位于操作符的左边 规则定义位于操作符的右边 方括号表示规则中的可选元素 方括号中的规则部
  • 推荐一些好用的小技巧给你

    技巧一 微信设置通话铃声 微信 作为一款主打移动通信的软件 没有自己专属的通话 彩铃 是否有些说不过去呢 所以我们可以在微信设置中 添加自己专属的 通话铃声 这样无论哪个好友拨打 微信电话 给你 都能听到你设置的 通话铃声 啦 操作指南 打
  • VC6添加自定义消息(主窗口向子窗口发送消息)

    从主窗口向子窗口发送消息 可以在子窗口中添加自定义的消息 然后在主窗口中需要地方呼叫该消息 呼叫方法 1 将子窗口添加为主窗口的成员变量 2 主窗口呼叫该消息 成员变量名 SendMessage UM PROGRESS 子窗口添加自定义消息
  • 连接Mysql数据库的报错: java.sql.SQLException: Unknown initial character set index ‘255’ received from server

    连接Mysql数据库的报错 java sql SQLException Unknown initial character set index 255 received from server Initial client characte
  • 树(Tree)——(一)基础知识

    目录 关于树的术语 儿子兄弟链式表示法 二叉树概念和基本特征 二叉树的形态 前序 中序 后序遍历特性 习题梳理 树存在的主要意义就是为了方便查找 如二叉树就有二分的思想 关于树的术语 1 结点的度 Degree 结点的子树个数 例如上面的图
  • qt小项目三 代码实现简易的QQ聊天界面的对话框弹出功能

    实现效果 点击成员列表中的头像 实现对应对话框弹出的功能 打开的对话框不可以再次打开 同时弹出提示消息框 打开一个窗口 再次打开该窗口 补充后的代码 myDialog cpp文件中新增信号槽处理函数 myDialog h文件中新增窗口打开状
  • QT学习之三:Qt Creator2.4.1的开发环境的配置和测试

    1 系统环境 主机操作系统 ubuntu10 04 主机编译器 gcc4 4 3 交叉编译器 arm linux gcc 4 3 2 前提条件 搭建好qt4 6 3的三个编译版本 PC X86 ARM 2 安装 Qt SDK Lin32 o
  • 极力推荐一本零基础学python的书籍,看完还没学会我也无能为力了

    python编程 上 下册 此书是由Eric Matthes撰写 他是高中科学和数学老师 现居阿拉斯加 在当地讲授Python入门课程 他从5岁就开始一直在编写程序 python编程 读者受益 该书旨在让你尽快学会Python 以便能够编写
  • Windows Maven解压版安装

    本文须知 安装maven环境之前要先安装java jdk环境 没有安装java环境的可以先去看安装JAVA环境的教程 Maven 3 3 require JDK 1 7 及以上 step1 下载maven 本教程安装的是目前最新版本3 8
  • knife Failed to start bean ‘documentationPluginsBootstrapper‘; nested exception is java.lang.NullPoi

    项目里面集成了knife swagger的升级版 结果报了空指针异常 猜测是版本或者jar冲突的问题 百度一下 有说是springboot 版本跟swagger 版本问题的 后面发现是 spring actutor 里面的guava 跟 k
  • 省选专练之神仙贪心IOI2013Robert

    问题描述 小沐把玩具扔在地板上 乱七八糟 庆幸的是 有一种特殊的机器人可以收拾玩具 不过他需要 确定哪个机器人去拣哪个玩具 一共有 T 个玩具 整数 w i 表示这个玩具的重量 整数 s i 表示这个玩具的体积 机器人有 两种 分别是 弱机
  • 银行日志处理

    与外围系统交换数据 例如信贷管理系统 财务管理系统数据归集等 系统内资金清算 例如通存通兑清算 批量代发代扣等 内部业务处理 例如结息 还息 自动转存 计提应付利息等 对账相关处理 例如生成第三方对账文件等 为数据分析平台准备数据 例如向数
  • Unity3D入门Demo-Cube移动-触发球体-切换场景

    Unity3D入门Demo Cube移动 触发球体 切换场景 新建Unity3D项目 选择3D类型 编写场景切换脚本ChangeScenes 添加场景切换脚本到游戏物体并保存Menu场景 新建Game游戏主场景 并添加方块和两个球体 编写C
  • 计算机管理器为什么没有本地用户和组,windows7系统服务器管理器没有“本地用户和组”选项解决方法...

    本地用户和组功能可以分配本地用户帐户或组帐户的权限和权利 win7系统点击 计算机 图标右键 管理 来打开 计算机管理 中的 本地用户和组 功能 但是有用户遇到windows7系统服务器管理器没有 本地用户和组 选项 怎么办呢 面对这个棘手
  • 根据后端返回的文件流下载文件

    方法一 import axios from axios const service axios create axios中请求配置有baseURL选项 表示请求URL公共部分 baseURL http localhost 3000 超时 t
  • ioc和di的关系

    刚进入spring的时候 看见这两个词一阵迷茫 控制反转不知道转的是啥 依赖注入也不知道注入的啥 有的人说这两个是一个 有的说di是ioc的实现 我就说说我的理解 从getter和setter开始 从开始学习mvc设计模式 或者是jsp异或