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的关系 的相关文章

  • 删除 PriorityQueue 的顶部?

    假设我使用 Java util 中的 PriorityQueue 类 我想从 PriorityQueue pq 中删除最大的数字 我们假设它位于队列的头部 下面的工作会起作用吗 1 int head pq peek pq dequeue h
  • 将 4 个字节转换为无符号 32 位整数并将其存储在 long 中

    我正在尝试用 Java 读取二进制文件 我需要读取无符号 8 位值 无符号 16 位值和无符号 32 位值的方法 执行此操作的最佳 最快 最美观的代码 是什么 我在 C 中做到了这一点 并做了类似的事情 uint8 t buffer uin
  • 在 IIS 中运行 Java Web 应用程序

    有人找到了在 IIS 中运行 Java Web 应用程序的方法吗 在我看来 编写一个将 Jetty 或自定义 servlet 容器与 IIS 集成的 ISAPI 插件 这个词正确吗 应该是完全可能的 这样做的好处是 许多优秀的高端 Java
  • GWT 代码服务器在使用 Maven 原型的新生成的项目中找不到模块

    我已经使用 GWT 和 eclipse 一段时间了 我想玩一下 Maven 和 GWT 插件 gwt maven plugin 在此输入链接描述 http mojo codehaus org gwt maven plugin 我尝试在 Ec
  • Android Studio 中没有参考文档

    昨天刚刚出现了一个新问题 当我将鼠标悬停在方法上或按 Ctrl Q 时 我通常会获取该特定方法的文档信息 但现在我只是得到 按 Ctrl QSharedPreferences getLong Following external urls
  • 检查 jar 是否从 shell 运行

    我有一个 java jar 程序 我试图在我的机器启动时运行它 理想情况下 shell 脚本将每 60 秒检查一次以确保 jar 正在运行 我如何检查 jar 是否在 centos 上运行 这似乎不起作用 我当前的 sh 文件 bin ba
  • Java GUI,根据actionListener更改面板

    我在两个不同的面板中添加了两个按钮 如果单击第一个按钮 则需要转到下一个面板 其中包含第二个按钮 但是当我单击第一个按钮时 该按钮没有被替换 Java GUI import java awt event ActionEvent import
  • 为什么ArrayList没有getSize()而不是size()?

    我在一些 JSP 页面中大量使用 ArrayList 我想像这样访问 ArrayList myArrayList size 但由于对象必须符合 JavaBean 标准 其中myArrayList getMyPropertyName is m
  • 使用 Gradle 构建 Kotlin + Java 9 项目

    我对 Gradle 老实说 还有 Java 9 相当陌生 我正在尝试使用 Gradle 构建一个混合了 Java 9 和 Kotlin 的简单库项目 更详细地说 Java中有一个接口 Kotlin中有一个实现 我会用 Kotlin 做所有事
  • 使用java将文件从GCS存储桶传输到SFTP服务器

    我能够从 GCS 存储桶读取文件 但所有库都喜欢jsch将文件传输到 SFTP 服务器时会查找文件路径 而不是内存中的文件 我不想将从GCS读取的文件写入磁盘 如何将内存中的文件传输到SFTP 我假设您想上传内存中的数据 JSch 实际上有
  • Java 会话变量

    我听说有些人认为在会话中将信息存储在服务器上是一个坏主意 因为它不安全 因此 在多页面业务流程功能中 应用程序将数据写入数据库 然后在需要时检索信息 在会话中存储私人信息是否一定不安全 只要会话本身安全 在会话中存储属性就不存在安全风险劫持
  • java代码的等效vb代码

    谁能告诉我这段Java代码到底做了什么 SecureRandom random SecureRandom getInstance SHA1PRNG byte bytes new byte 20 synchronized random ran
  • 为什么我用Java计算的结果是错误的?

    我使用这段代码来计算一些东西 但几乎在所有情况下结果都是 0 0 为什么 编译器中没有警告或错误 private void jButton1ActionPerformed java awt event ActionEvent evt try
  • 清单合并失败:需要为 显式指定 android:exported

    我的清单文件有问题 错误消息 清单合并失败 android 需要为 明确指定导出 面向 Android 12 及更高版本的应用需要指定显式值android exported当相应的组件定义了意图过滤器时 有关详细信息 请参阅 https d
  • 如何删除 Spring 的 RestTemplate 添加的某些 HTTP 标头?

    我在远程服务方面遇到问题 我无法控制对使用 Spring 的 RestTemplate 发送的请求进行 HTTP 400 响应 使用发送的请求curl但被接受了 所以我将它们与通过 RestTemplate 发送的内容进行了比较 特别是 S
  • 选择活动时运行时崩溃

    首先我想说我几乎没有 Android 经验 这是我在 Android 中的第一个项目 而且我的老师不太擅长教学 所以我对任何过度的无知表示歉意 在进一步讨论之前先解释一下 我的应用程序的目标本质上是能够记录您在某些活动上花费了多少时间 记录
  • 如何列出所有已加载的 Spring bean 定义文件

    在大型企业系统中 并不总是清楚在 ApplicationContext 构建期间导入了哪些文件 有没有办法列出过程中加载的所有文件 我知道如何列出加载的属性文件 但不知道导入的 bean 文件 更新示例 文件 1 applicationCo
  • 为什么我得到:没有有效的 JFX 运行时

    我有一个使用 java 1 6 编译并使用 jnlp webstart 运行的现有应用程序 如果我使用 JRE 1 6 从客户端运行此应用程序 一切都会很好 但是 当我使用 java JDK 7 编译代码并使用 JRE 1 7 67 运行客
  • SQL准备语句如何通过多个可能的菜单选择进行选择?

    所以我有 4 个菜单选择 产品 位置 课程类型和类别 所有这些都可以为空 使用 JSF 编程 但这应该与这个问题无关 因为它是一个 SQL 问题 菜单选择将向托管 bean 发送用户选择的变量 并使用准备好的语句使用用户选择的菜单中的信息
  • java有类似C#的属性吗? [复制]

    这个问题在这里已经有答案了 C 属性 我的意思是 get 和 set 方法 是一个非常有用的功能 java 也有类似 C 的属性吗 我的意思是我们如何在 java 中实现类似以下 C 代码的内容 public string Name get

随机推荐

  • 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异或