控制反转 IOC 与依赖注入 DI

引言

简单总结和巩固一下spring的核心原理——IOC和DI的概念,为什么IOC要叫控制反转?IOC和DI的关系是怎样的?

一、IOC 控制反转

初学者可能很好奇,为什么spring framework的对象托管容器叫做 IOC容器(Inversion of control)?

设想这样一个场景,A对象依赖B对象。如果 new A,就需要先 new B,这是最基本的依赖创建方式。我们管 A 去申请 B 对象的过程,称为“资源查找”,可以理解为 A 对象需要向虚拟机申请一个资源 B 对象。

传统的资源查找(如上所述)要求组件向容器(可以理解为JVM)主动发起请求,查找资源作为响应,容器适时返回资源。

这种方式要求每个 Java 对象必须自己控制实例化的过程。存在的问题就是,当依赖对象过多,层层依赖等情况,创建对象的过程将会极其复杂和冗长,极大地降低了代码的维护性和健壮性。

IOC资源查找方式是容器根据配置文件的描述统一管理组件的构造和依赖,主动注入依赖。对象创建的控制权由传统方式的对象主动发起资源申请,变为对象被动接收依赖注入。因此得名 Inversion of control 控制反转。

IOC是一种更侧重于原理的技术描述,它描述了一种被动依赖注入的对象托管服务理念。

二、DI 依赖注入

Dependency Injection 依赖注入,是比 IOC 更广泛的概念,它包含 IOC ,因此 IOC 有时候也称为 DI 。

任何情况的对象组装都可以称为依赖注入,如前面提到的创建 A 时,通过构造器或属性赋值传入 对象 B,这就是依赖注入的含义。

显而易见,由前面提到的“传统资源查找”的对象创建方式属于“主动依赖注入”,而 IOC 就属于被动依赖注入。

不过随着被动依赖注入的理念深入人心,IOC 与 DI 的概念经常一并提起,因此有时候二者也会混用,但实际上 DI 是包含 IOC 的。

DI 可以理解为 IOC 的另一种表达方式,即组件以一些预先定义好的方式(如 setter)接收来自容器的资源注入。相比于IOC 而言,这种表达方式更加直观易懂。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring —— 容器内部逻辑

引言 上一篇关于IoC容器的详解《Spring —— IoC 容器详解》真是工程浩大,可以说Spring官网对核心中的核心IOC容器做了非常全面的使用说明,包括在《Spring揭秘》中让我一直没有成功的Method Injection,官网也解决了我的疑惑,并最…

2020 年度总结

2020年给我的感觉是短平快的一年。 由于年初的新冠肺炎疫情,我大半年都呆在北京的破旧出租屋里写代码。整个春天和夏天,平平无奇。 2月1日返京,居家办公,夜跑。8月复工,疯狂爆痘、烂脸,月末落户天津。9月…

Spring 全局异常捕获

引言 前后端分离开发,后台有时候会出现不可预知的异常(运行时异常),在实际生产中通常需要统一返回符合一定响应结构的异常信息给前端,这一方面可以避免用户看到后台的报错信息,一方面也是保护后端程序免受…

JDBC——概述与JDBC的使用

引言 一直希望深入学习一下数据库持久化技术,接触过Hibernate、Mybatis,也使用过Spring事务管理来控制回滚操作,但是越发觉得底层知识有一定的知识盲区和空洞。 很多ORM框架都是基于JDBC规范来进行构建的,因此,学习J…

JDBC——实现通用的查询

引言 上一篇jdbc的文章《JDBC——概述与JDBC的使用》介绍了JDBC的概念和背景知识,同时也讨论了获取数据库连接的方式,以及简单的实现了入库操作(更新、删除同理)。 本篇博客将会聚焦 PreparedStatement 的查询操作、以及 Result…

JDBC——编程式事务的实现逻辑

引言 数据库事务的概念和基础,总结在《MySQL 基础 ————事务与隔离级别总结》。 本篇博客通过“JDBC 纯编码”方式实现事务控制,完成一个 A 给 B 转账的小功能,在进一步熟练JDBC的编程流程的同时,重点关注 Java 语言如何操作…

排序算法——插入排序

一、算法思想 给定一个无序数列,模拟一个指针从第0位开始向后,始终保持当前位置左边的数列是有序的。 指针位置上的元素依次与前面的元素比较,当遇到小于自己的数或右边已经没有元素时,都停止比较,开始下一轮。 生活…

Linux 底层原理 —— epoll 与多路复用

引言 epoll 是 Linux 系统下高性能网络服务的必备技术,很多面试中高频出现的 Nginx、Redis 都使用了这一技术,本文总结 linux 多路复用模型的演变过程,看一看epoll 是如何实现高性能的。 一、相关基础知识 1.1 文件描述符 文件描述符&…

排序算法——对数器

引言 所谓“对数器”就是校验算法的工具程序,我们使用Math.random() 方法可以生成一个随机乱序数组,并通过Arrays.sort 来比较我们的算法是否正确。 代码实现 对数器主要是使用对照来校验是否正确,除了一些比较方法、拷贝方法,…

查找算法——二分法

引言 二分法,顾名思义,即一分为二的方法,通常用于判断在某个有序数列中是否存在某个数,由于其优秀的算法思想,时间复杂度一般都是 O(logN) ,通常要 O(N) 的遍历方式更加优秀。 一、经典二分法查找 最常见…

异或运算的应用

一、基础知识 异或运算,相异为1。 异或运算是一种常用的位运算,在算法题中,对于避免额外的空间复杂度有独特的用处。 异或运算也被称为“无进位相加”,它具有以下特性: 特性1:0 ^ N N 特性2&#xff1a…

链表的基本操作——反转与删除

引言 链表相关的问题几乎都是coding问题,以下是两个简单的链表问题。 一、单链表或双链表如何反转 1.1 单链表的反转操作 给定一个 Node 结构: public static class Node {public int value;public Node next;public Node(int data) {this.value d…

单向队列、双端队列、栈的模型实现

引言 自己实现简单的队列、栈的逻辑结构。 队列都包含头和尾两个指针,简单的单向队列只能在一端(如:head端)入列,在另一端(如:tail 端)出列;双端队列可以在 head 进出&…

递归算法及其时间复杂度分析

引言 “递归” 一词是比较专业的计算机术语,在现实生活中,有一个更可爱的词——“套娃”。如果把“递归算法”叫做“套娃算法”,或许可以减少一些恐惧程度。 套娃是有限的,同样,递归也是有限的,这和我们经…

算法设计中的基础常用代码

引言 本篇博客旨在记录一些基础算法知识的常见组合用法,以及何时使用,需要注意的问题等,长期更新。 为什么要这样总结呢?难道掌握了位运算、常用算法工具API的定义还不够吗? 这是因为某些知识比如 &、 |、 ~、 …

Redis —— 常用命令一览

引言 参考《菜鸟教程 Redis 常用命令》,其中红色为极其重要,蓝色为重要。 一、总览 二、key相关命令 三、String 相关命令 四、Hash 相关命令 五、List 相关命令 六、Set 相关命令 七、ZSet 相关命令

Redis 实用技术——Pipeline

引言 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。 这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。服务端处理命令&#x…

Redis 实用技术——消息发布和订阅

引言 发布订阅模型是redis的重要功能,它可以像网站动态一样,将消息发送到多个订阅者的主页里。 一、常用命令 二、消息格式 消息是一个有三个元素的多块响应: 如上图,发布者向 mysub 频道发送了一条消息,redis会返回…

Redis 实用技术——事务

引言 redis的事务不像关系型数据库的事务那样完整。 “快”是redis的特征,在事务管理的过程中,使用muti命令开启事务块,当输入多条命令后,再使用exec命令执行事务块中的全部命令。 Redis事务可以保证两件事: 1、隔…

排序算法——归并排序的相关问题

一、小和问题 问题描述,给定一个数组,如[1, 3, 2, 6, 5],计算每个数左边小于自己的所有数的和,并累加。例如: 1左边没有数 3左边有一个小于自己的数 1 2左边有一个小于自己的数 1 6左边有三个小于自己的数 1 3 2 6…