【Spring】IoC 与 DI

news2024/10/6 14:22:57

IoC 与 DI

  • 1. IoC
  • 2. DI

1. IoC

IoC (Inversion of Control): 控制反转

控制反转: 表示应用程序的控制权(对象的生命周期)由应用程序自身的代码反转到容器或框架中。应用程序的组件不再直接控制其依赖项的创建和生命周期管理,而是委托给容器。

Spring 就是一个具有众多工具方法的 IoC 容器。

在这里插入图片描述

  • 没有引入 IoC 容器时,对象 A 依赖于对象 B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象 B。无论是创建还是使用对象 B,控制权都在自己手上。

  • 引入 IoC 容器之后,这种情形就完全改变了,对象 A 与对象 B 之间失去了直接联系,当对象 A 运行到需要对象B的时候,IoC 容器会主动创建一个对象 B 注入到对象 A 需要的地方。

通过前后的对比,我们不难看出来:对象 A 获得依赖对象 B 的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。

举个栗子:

  • 不使用 IoC 容器.
class MessageService {
    public void sendMessage(String message, String recipient) {
        // 发送消息的具体实现
    }
}

class NotificationService {
    private MessageService messageService = new MessageService();

    public void sendNotification(String message, String recipient) {
        // 构造消息并发送通知
        messageService.sendMessage(message, recipient);
    }
}

在这段代码中, NotificationService 在内部创建了一个 MessageService 的实例,这种紧耦合会使代码难以测试和扩展。

  • 使用 IoC 容器
class MessageService {
    public void sendMessage(String message, String recipient) {
        // 发送消息的具体实现
    }
}

class NotificationService {
    private MessageService messageService;
    
    // 构造函数中接受一个 MessageService 实例
    public NotificationService(MessageService messageService) {
        this.messageService = messageService;
    }

    public void sendNotification(String message, String recipient) {
        // 构造消息并发送通知
        messageService.sendMessage(message, recipient);
    }
}

现在,NotificationService 不再创建 MessageService 实例,而是在构造函数中接受一个 MessageService 实例。
将 MessageService 的创建、销毁、生命周期的管理全部交给框架,而我们只需要用就完了,不用关注什么时候创建、以什么样的方式创建、什么时候去销毁。
这样,就算 MessageService 的构造方法什么的变了,NotificationService 的代码也不需要怎么改动 。

使用 IoC 的好处:

  1. 解耦: IoC 通过将组件的依赖关系从组件自身中解耦,使得组件之间的耦合度降低,容器会负责创建和配置组件,并确保它们的依赖关系正确注入。这使得更容易替换、更新或修改组件,而无需对整个应用程序进行大规模的修改。
  2. 易于扩展:IoC 允许轻松地添加新的组件或替换现有的组件,而不会对应用程序的整体架构产生重大影响。这种方式使得应用程序更加灵活,易于维护和扩展。

2. DI

DI (Dependency Injection) : 依赖注⼊

所谓依赖注⼊,就是由 IoC 容器在运⾏期间,动态地将某种依赖关系注⼊到对象之中,利⽤依赖关系注⼊的⽅式,实现对象之间的解耦。
所以,依赖注⼊(DI)和控制反转(IoC)是从不同的⻆度的描述的同⼀件事情, IoC 是思想,DI 是具体的实现。

⽐如说我今天⼼情⽐较好,吃⼀顿好的犒劳犒劳⾃⼰,那么“吃⼀顿好的”是思想和⽬标(是 IoC),但最后我是吃海底捞还是杨国福?这就是具体的实现,就是 DI。

总结:

IoC 与 DI 的区别就是 IoC 是一种思想,DI 是具体的实现。

好啦! 以上就是对 IoC 与 DI 的讲解,希望能帮到你 !
评论区欢迎指正 !

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

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

相关文章

微服务moleculer03

1. Moleculer 目前支持SQLite,MySQL,MariaDB,PostgreSQL,MSSQL等数据库,这里以mysql为例 2. package.json 增加mysql依赖 "mysql2": "^2.3.3", "sequelize": "^6.21.3", &q…

Windows下载AOSP

关于repo repo只是谷歌做的,方便下载安卓源码的工具,本质上是对下载清单进行批量处理,然后使用git克隆。 在windows上下载源码只需要自己处理即可。 具体做法 首先使用git克隆安卓源码清单 git clone https://mirrors.tuna.tsinghua.edu.…

1.Tensor For Beginner - Motivation

为何要研究张量? --主要原因是几何。 Tensors Geometry 了解张量后,可深入了解几何的工作原理 几何的一个例子:爱因斯坦广义相对论中的时空几何 时空是如何弯曲的,宇宙是如何膨胀的。 要从数学上理解这两个问题&am…

归并排序及其非递归实现

个人主页:Lei宝啊 愿所有美好如期而遇 目录 归并排序递归实现 归并排序非递归实现 归并排序递归实现 图示: 代码: 先分再归并,像是后序一般。 //归并排序 void MergeSort(int* arr, int left, int right) {int* temp (int…

Pikachu靶场——越权访问漏洞(over permission)

文章目录 1. over permission1.1 水平越权1.1.1 源代码分析1.1.2 漏洞防御 1.2 垂直提权1.2.1 源代码分析1.2.2 漏洞防御 1.3 越权访问漏洞防御 1. over permission 漏洞描述 越权访问(Broken Access Control,BAC),指应用在检查…

用python表格初级尝试

Excel,我的野心 当我输入3,2 就表示在第3行第2列。的单元格输入数据input输入表头 (input内除了/,空格 回车 标点符号等 全部作为单元格分隔符)由我设置input输入的是行or列 给选项 1. 行 2. 列默认回车或没输入值是列由我设置起…

SEO效果又慢又差,为什么还会有SEO从业者?

“SEO效果又慢又差,这么还会有SEO从业者?”这句话是我今天在某Q群里看到的,其实这个问题我之前也有写过一篇《你问我,为什么还有人做SEO?》。我文中提到过因为搜索无处不在,有搜索后,搜索引擎就…

JavaScript:从入门到进阶的旅程

JavaScript是一种广泛使用的编程语言,为网页和应用程序提供了交互性和动态性。从初学者到资深开发者,JavaScript都是一项值得掌握的技能。在本文中,我们将探讨JavaScript的基础知识,以及一些进阶的概念和技巧。 一、JavaScript简…

Linux系统编程系列之线程

一、什么是线程 线程(Thread)是计算机中的基本执行单元,是操作系统调度的最小单位。线程是进程内的一个独立执行流程,一个进程可以包含多个线程,这些线程共享进程的资源,但每个线程都有自己的独立栈空间以及…

基于SSM的学生事务处理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

matplotlib从起点出发(9)_Tutorial_9_cycler

0 需求 绘图时有时需要指定几种颜色,或者线型,我们统称为样式,让绘制出的内容在这些样式中循环配置。这时就需要使用到本文所提到的技巧,即cycler. 1 进入教程 本文是自定义属性循环(cycler)设置的演示,用于控制多线…

travel总结:

1、前期准备: 对于项目的大体构成做了一定的了解,然后主要是做后端的数据处理,前期的准备的话创建项目的大体结构,servlet、service、domain、dao、utils的项目结构。以及一些基础的代码的生成,我觉得最主要的是一些基…

leetCode 55.跳跃游戏 贪心算法

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 示例 1: 输入…

MySQL的卸载与安装(Linux)

MySQL 前言1. 卸载MySQL1.1 查询与关闭对应MySQL服务1.2 卸载对应安装包 2. 安装MySQL2.1 配置MySQL官方yum源2.2 开始安装MySQL 前言 在这里演示的卸载与安装MySQL都是在Linux的Centos 7.6 环境下,不同环境会有所出入。 为了避免安装和卸载MySQL过程中受到权限的…

CF505B Mr. Kitayuta‘s Colorful Graph

Mr. Kitayuta’s Colorful Graph 题面翻译 给出一个 n n n 个点, m m m 条边的无向图,每条边上是有颜色的。有 q q q 组询问 对于第 i i i 组询问,给出点对 u i , v i u_i,v_i ui​,vi​。求有多少种颜色 c c c 满足:有至…

算法-动态规划/trie树-单词拆分

算法-动态规划/trie树-单词拆分 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/word-break/description/?envTypestudy-plan-v2&envIdtop-interview-150 1.2 题目描述 2 动态规划 2.1 解题思路 dp[i]表示[0, i)字符串可否构建那么dp[i]可构建的条件是&…

基于ssm的互联网废品回收/基于web的废品资源利用系统

摘 要 本毕业设计的内容是设计并且实现一个基于SSM框架的互联网废品回收。它是在Windows下,以MYSQL为数据库开发平台,Tomcat网络信息服务作为应用服务器。互联网废品回收的功能已基本实现,主要包括用户、回收员、物品分类、回收物品、用户下单…

W、X、Y

W z学长的apex 不等于180度的角的个数就是求转折点的个数 而每个y(x)都是一元函数,按照公式每个一元函数的转折点为 s(x)是若干y(x)的叠加,其中一个y(x)有转折点,在对应位置上s(x)也会有转折点 所以所有y(x)函数中不重复的转折点的个数就是…

Java练习题-键盘录入字符串实现大小写转换

✅作者简介:CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1🏆 📃个人主页:hacker707的csdn博客 🔥系列专栏:Java练习题 💬个人格言:不断的翻越一座又…

【LeetCode热题100】--108.将有序数组转换为二叉搜索树

108.将有序数组转换为二叉搜索树 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 二叉搜索树的中序遍历是升序…