IoC 容器总结

news2024/12/23 14:01:21

目录

理解 IoC

实现方式

DI 实现原理

@Autowired VS @Resource 区别

IoC 和 DI 有什么区别


理解 IoC

IoC——控制反转,是 Spring 框架的核心概念之一,是一种设计原则和编程模式,用于实现松耦合和可测试的应用程序

控制反转:对象的生命周期不是由程序员来控制,而是由 Spring 来控制(传统的编程模式中,对象之间的创建、组装和管理都是由开发人员手动完成,在 IoC 模式下,这些责任被委托给一个容器来管理)

IoC 最大的优点:实现解耦合(松耦合)


传统开发中:比如构建一辆汽车

构建汽车对象,然后依赖车身建立车身对象,车身依赖底盘建立底盘对象,底盘依赖轮胎建立轮胎对象,如果想要改变轮胎尺寸需要在整个调用链上所有代码都需要修改,本质需要改动的越少越好

IoC程序开发

改进之后:不再是上级对象创建并控制下级对象,而下级对象注入当前对象即使下级类发⽣任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的实现思想,实现了解耦合

实现方式

IoC 容器主要通过两种方式实现控制反转:

  1. 依赖注入(DI):IoC 容器在运行期间,动态的将依赖对象获取到的过程。通过将依赖关系注入到对象中,实现对象之间的解耦合。容器负责查找依赖对象,并将其自动的注入到相应的对象中。依赖注入可以通过构造函数、Setter 方法 或者接口注入来完成
  2. 依赖查找:通过容器提供的 API,开发人员手动查找和获取所需的依赖对象。开发人员在代码中通过容器提供的接口来获取所需的对象实例,从而实现了对象之间的解耦。

DI 实现原理

DI 的实现原理是通过反射机制实现的。通过反射给成员变量赋值,这里的成员变量就是我们所说的依赖。比如TestController当中有个TestService对象,他需要依赖TestService对象当中的方法,那么TestService就是TestController的依赖。

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

这里就考验到了通过反射我们有几种方式可以给TestService赋值,一共有如下三种:

1️⃣直接给属性赋值

优点:实现简单、使用简单,只需要给变量上添加一个注解(@Autowired),就可以在不 new 对象的情况下,直接获得注入的对象了(这就是 DI 的功能和魅力所在)

缺点:无法注入 final 修饰的变量;只适用于 IoC 容器;违背单一设计原则

2️⃣通过set方法给变量赋值

优点:通常 Setter 只 Set 一个属性,所以 Setter 注入更符合单一设计原则

缺点:无法注入 final 修饰的变量;setter 注入的对象可以被修改(setter 本来就是一个方法,有可能被多次调用和修改)

3️⃣通过构造方法给变量赋值:如果当前的类中只有一个构造方法,那么 @Autowired 也可以省略

Spring 官方从 4.x 之后推荐的注入方式

优点:可以注入 final 修饰的变量;注入的对象是不会被修改(因为构造方法只会加载一次);构造方法注入可以保证注入对象完全初始化;构造方法注入通用性更好

缺点:写法比属性注入复杂、使用构造方法注入,无法解决循环依赖的问题


 当使用 @Autowired 注释时,Spring 容器会自动查找与该类型匹配的 bean,并将其注入到该字段中。如果有多个匹配的 bean,则可以使用 @Qualifier 注释来指定要注入的 bean 的名称。

当使用 @Value 注释时,Spring 容器会将属性值注入到该字段中。属性值可以从配置文件中读取,也可以是硬编码的值。

4️⃣另外一种注入关键字@Resource

@Autowired VS @Resource 区别

1️⃣出身不同:@Resource 来自于JDK;@Autowired 来自于 Spring 框架

2️⃣支持的参数不同:@Resource 支持很多参数设;@Autowired 只支持一个参数设置(@Qualifier)

3️⃣使用区别:@Resource 不支持构造方法注入;而 @Autowired 支持构造方法注入

4️⃣idea 兼容性支持不同:使用 @Autowired 在 idea 专业版可能会报错;@Resource 不存在误报的问题

@Autowired来自于 spring,spring 框架是在程序执行之后再执行,不能检测到当前类是否注入(注入是的到 spring 当中)

@Resource:java代码是在程序执行之前执行的,能检测到已经注入

例如:我在开直播,有人先进来可以听到我之前讲的知识,有人后来就听不到我之前讲的知识,但是对于这个知识我已经讲过了,这个知识点是存在的。

IoC 和 DI 有什么区别

IoC 和 DI 都是 Spring 框架中的核心概念,它们的区别在于:

  • IoC(Inverse of Control,控制反转):它是一种思想,主要解决程序设计中的对象依赖关系管理问题。在 IoC 思想中,对象的创建权反转给第三方容器,由容器进行对象的创建及依赖关系的管理。
  • DI(Dependency Injection,依赖注入):它是 IoC 思想的具体实现方式之一,用于实现 IoC。在 Spring 中,依赖注入是指:在对象创建时,由容器自动将依赖对象注入到需要依赖的对象中。

简单来说,它们的关系是:

  • IoC 是一种思想、理念,定义了对象创建和依赖关系处理的方式。
  • DI 是 IoC 思想的具体实现方式之一,实际提供对象依赖关系的注入功能。

比如说我今天吃⼀顿美餐,那么“美餐”是目标(是 IoC),但最后我是吃火锅还是烧烤?这就是具体的实现,就是DI

例如在 Spring 框架中:

  • IoC 体现为 Spring 容器承担了对象创建及依赖关系管理的控制权。
  • DI 体现为 Spring 容器通过构造方法注入、Setter 方法注入等方式,将依赖对象注入到需要依赖的对象中。

所以综上,IoC 和 DI 之间的关系可以这样理解:

  • IoC 是理论,DI 是实践。
  • IoC 是思想,DI 是手段。
  • IoC 是整体,DI 是部分。

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

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

相关文章

《二叉树》——1

目录 前言: 二叉树的链式结构 二叉树的遍历 前序遍历: 中序遍历: 后序遍历: 总结: 前言: 从本文开始,将进一步深入学习编程语言思想,从二叉树开始我们将接触许许多多的递归算…

力扣hot100 合并两个有序链表 递归 双指针

Problem: 21. 合并两个有序链表 文章目录 💖 递归思路 💖 双指针 💖 递归 思路 👨‍🏫 参考地址 n , m n,m n,m 分别为 list1 和 list2 的元素个数 ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) 🌎 空间复杂…

力扣62. 不同路径

动态规划 思路: 定义 dp[r][c] 为到达坐标 (r, c) 的路径数: 它只能有同一行左边相邻方格向右到达或者同一列上方相邻方格向下到达;状态转移方程: dp[r][c] dp[r][c - 1] dp[r - 1][c]初始状态 dp[0][0] 1第一行的路径数是 1第…

恒创科技:云服务器配置中的vCPU与物理CPU有啥区别?

​  说到云服务器,您可能经常会遇到vCPU这个词,而且它和物理CPU经常被拿来谈论。尽管它们听起来相似,但两者之间存在显著差异。在本文中,我们将详细讨论云vCPU和物理CPU之间的差异。 物理与虚拟 CPU 和 vCPU 之间最显著的区别在…

【Linux】-对于信号章节补充的知识点,以及多线程知识的汇总

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

非线性最小二乘问题的数值方法 —— 狗腿法 Powell‘s Dog Leg Method (II, Python 简单实例)

Title: 非线性最小二乘问题的数值方法 —— 狗腿法 Powell‘s Dog Leg Method (II, Python 简单实例) 姊妹博文 非线性最小二乘问题的数值方法 —— 狗腿法 Powell‘s Dog Leg Method (I - 原理与算法) 0.前言 本篇博文作为对前述 “非线性最小二乘问题的数值方法 —— 狗腿法…

L1-069 胎压监测(Java)

小轿车中有一个系统随时监测四个车轮的胎压,如果四轮胎压不是很平衡,则可能对行车造成严重的影响。 让我们把四个车轮 —— 左前轮、右前轮、右后轮、左后轮 —— 顺次编号为 1、2、3、4。本题就请你编写一个监测程序,随时监测四轮的胎压&…

系统架构14 - 软件工程(2)

需求工程 需求工程软件需求两大过程三个层次业务需求(business requirement)用户需求(user requirement)功能需求 (functional requirement)非功能需求 概述活动阶段需求获取基本步骤获取方法 需求分析三大模型数据流图数据字典DD需求定义方法 需求验证需求管理需求基线变更控制…

Hylicos - MINI2440 - 中断控制

中断 中断源管理 中断是一种异步异常,CPU需要处理很多来自设备的中断请求,而CPU引出的line只有IRQ线和FIQ线,所以就得引入中断控制器帮助CPU搞清楚是中断的来源。 MINI2440的中断控制器,可以接受来自60个中断源的请求。提供这些…

Redis双写一致性

所有的情况都是再并发情况下存在温蒂 一、先更新数据库,再更新缓存场景-不推荐 当有两个线程A、B,同时对一条数据进行操作,一开始数据库和redis的数据都为1,当线程A去修改数据库,将1改为2,然后线程A在修改…

幻兽帕鲁专用服务器

随着幻兽帕鲁这款游戏的热度持续升温,我们遍寻全网,带给各位玩家一个全新的、高品质的游戏体验——莱卡云服务器。有幻兽帕鲁的热衷者们无需再为了服务器的选取困扰,因为我们可以肯定地说:选择莱卡云,你不会失望。 首先…

数据库复试—关系数据库标准语言SQL

数据库复试—关系数据库标准语言SQL SQL:结构化查询语言 以教材中的学生-课程数据库为例进行SQL基础语法的复习 数据库实验环境选择SQLServer 11 关系模式 学生表Student(Sno,Sname,Ssex,Sage,Sdept) 课程表Course(Cno,Cname,Cpno,Ccredit) 学生选课表SC&#xf…

Linux操作系统——理解软硬链接

1.引言 通过我们前面理解文件系统的基础上,我们来理解软硬链接,在我们学习文件的时候我们会见到各种链接文件,其中链接文件分为两种,一种叫软连接,一种叫硬链接。 下面我们新建一个log文件,要对log这个文…

搭建一个简单的Spring Demo

要学习Spring 源码,一个是从Spring GitHub 上去down源码,然后倒入IDEA编译,但这种方法费时费力,如果你不需要对Spring 源码进行修改后,再编译的话,直接搭建一个Spring Demo 的Maven项目,引入Spr…

Linux操作系统——理解文件系统

预备知识 到目前为止,我们所学习到的关于文件的操作,全部都是基于文件被打开,被访问,访问期间比较重要的有重定向,缓冲区,一切皆文件,当我们访问完毕的时候需要将文件关闭,关闭时那…

关于事务的最常见的十道面试题

面试题一:什么是事务?为什么需要事务? 事务(Transaction)是保证数据库可靠性和稳定性的一种机制,单个逻辑工作单元执行的一系列操作,这些操作要么全部完成,要么全部不完成,是数据库环境中的最小…

Aria2 WebUI控制台 任意文件读取漏洞复现(CVE-2023-39141)

0x01 产品简介 Aria2 WebUI控制台是用于下载文件的实用程序。它支持 HTTP(S)/FTP/SFTP/BitTorrent 和 Metalink 协议。aria2可以从多个来源/协议下载文件,并尝试利用您的最大下载带宽。它支持同时从HTTP(S)/FTP/SFTP和BitTorrent下载文件,而从HTTP(S)/FTP/SFTP下载的数据上…

《WebKit 技术内幕》学习之八(1):硬件加速机制

《WebKit 技术内幕》之八(1):硬件加速机制 1 硬件加速基础 1.1 概念 这里说的硬件加速技术是指使用GPU的硬件能力来帮助渲染网页,因为GPU的作用主要是用来绘制3D图形并且性能特别好,这是它的专长所在,它…

深入了解WPF控件:常用属性与用法(六)

掌握WPF控件:熟练常用属性(六) ListView 用于展示数据项集合的列表控件。它提供了丰富的功能和灵活的定制性,可以轻松地展示和编辑大量的数据。 常用属性描述ItemsSource用于设置ListView的数据源。可以是一个集合、数组或列表…