Spring——控制反转(IOC)与依赖注入(DI)

news2024/12/24 9:13:10

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js实战 🍒Three.js

🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

内容参考链接
Maven概念、IDEA集成、Maven坐标、依赖配置、依赖传递、排除依赖、依赖范围、生命周期
请求响应请求响应(简单参数、实体参数、数组集合参数、日期参数、JSON参数、路径参数、统一响应结果)

文章目录

    • 前言
    • 三层架构
    • 分层解耦
    • 控制反转(IOC)与依赖注入(DI)
    • IOC 详解
    • DI 详解
    • 总结

前言

大家好,这里是前端杂货铺。

本篇文章我们学习 Spring 的关键技术 => 控制反转(IOC)和 依赖注入(DI)。


三层架构

在这里插入图片描述

controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。
service:业务逻辑层,处理具体的业务逻辑。
dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增、删、改、查。


分层解耦

内聚:软件中各个功能模块内部的功能联系。
耦合:衡量软件中各个层/模块之间的依赖、关联的程度。

软件设计原则:高内聚低耦合。


控制反转(IOC)与依赖注入(DI)

控制反转(IOC):对象的创建控制权由程序自身转移到外部(容器),这种思想成为控制反转。
依赖注入(DI):容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
Bean 对象:IOC容器中创建、管理的对象,称之为 bean。

Service层 及 Dao层的实现类,交给 IOC 容器管理。
为 Controller 及 Service 注入运行时,依赖的对象。

@Component 注解:将当前类交给 IOC 容器管理,成为 IOC 容器中的 bean —— 控制反转
@AutoWired 注解:运行时,IOC 容器会提供该类型的 bean 对象,并赋值给该变量 —— 依赖注入

在这里插入图片描述

在这里插入图片描述


IOC 详解

要把某个对象交给 IOC 容器管理,需要在对应的类上加上如下注解之一:

注解位置
@Component声明 bean 的基础注解,不属于以下三类时,使用此注解
@Controller@Component 的衍生注解,标注在控制器类上
@Service@Component 的衍生注解,标注在业务类上
@Repository@Component 的衍生注解,标注在数据访问类上(由于与 mybatis 整合,用的少)

注意事项:

  • 声明 bean 时,可以通过 value 属性指定 bean 的名字,如果没有指定,默认为类名(首字母小写)。
  • 使用以上四个注解都可以声明 bean,但是 springboot 集成 web 开发中,声明控制器 bean 只能用 @Controller。

DI 详解

@Autowired 注解,默认是按照类型进行,如果存在多个相同类型的 bean,就会报一下错误:

在这里插入图片描述

解决方案如下:

在这里插入图片描述


总结

在Java中,AOP(面向切面编程)、IOC(控制反转)和DI(依赖注入)是三个重要的概念,它们在软件开发和架构设计中扮演着不同的角色。

概念描述关注点
AOP(面向切面编程)面向切面编程是一种编程范式,它允许开发者将横切关注点(如日志、事务管理等)从业务逻辑中分离出来,并通过切面的方式统一处理。- 横切关注点:将跨越多个模块或类的关注点提取出来。 - 切面:定义横切关注点的模块化单元。 - 增强:在目标方法执行前后添加的代码,如日志记录、事务管理等。
IOC(控制反转)控制反转是一种设计原则,用于降低代码之间的耦合度。在IOC中,对象的创建和生命周期管理不再由对象本身控制,而是由外部容器(如Spring容器)负责。- 依赖关系的反转:传统上,对象A依赖于对象B时,A会主动创建B的实例。在IOC中,A不再负责B的创建,而是由外部容器创建B并将其注入到A中。 - 容器:负责对象的创建、配置、组装和管理。
DI(依赖注入)依赖注入是IOC的一种具体实现方式。在DI中,对象的依赖关系不是通过对象内部硬编码的方式实现,而是通过外部容器在运行时动态地注入到对象中。- 注入方式:包括构造函数注入、设值方法注入和接口注入等。 - 依赖的透明性:对象不需要知道其依赖的具体实现,只需声明依赖即可。 - 灵活性:依赖关系可以在运行时动态地改变,而无需修改代码。
  • AOP 关注于横切关注点的模块化,通过切面来增强业务逻辑的功能。
  • IOC 是一种设计原则,用于降低代码之间的耦合度,通过外部容器来管理对象的生命周期和依赖关系。
  • DI 是 IOC 的一种具体实现方式,通过动态地将依赖注入到对象中来实现对象之间的解耦。

好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!


参考资料:

  1. JavaWeb开发(bilibili-黑马程序员)
  2. 菜鸟教程–Java

在这里插入图片描述


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

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

相关文章

【C++题解】1722 - 输出两位的巧数

问题:1722 - 输出两位的巧数 类型:简单循环 题目描述: 巧数指的是这样一种特殊的数,该数的各个位数字之和加上各个位数字之积等于本身的自然数。 比如整数 19 ,就是一个巧数,因为(19)(19)10919。 请编程输…

DataWhale AI夏令营 2024大运河杯-数据开发应用创新赛-task3

DataWhale AI夏令营 2024大运河杯-数据开发应用创新赛 数据增强数据收集打标签 多的不说少的不唠,之前说过初赛基本就是比谁的数据好了,因为原始数据的质量太低了想跑到0.25都很难所以需要使用一些数据增强策略以及收集一些新的数据集。 数据增强 计算…

LVGL 控件之按钮(lv_button)

目录 一、按钮1、概述2、样式2.1 设置背景2.1.1 颜色2.1.2 透明度2.1.3 渐变色2.1.4 渐变色起始位置设置 2.2 修改边界2.2.1 宽度2.2.2 颜色2.2.3 透明度2.2.4 指定边 2.3 修改边框2.4 修改阴影2.4.1 宽度2.4.2 透明度2.4.3 偏移坐标2.4.4 颜色2.4.5 延伸 2.5 设置圆角弧度2.6 …

C++STL~~list

文章目录 一、list的概念二、list的使用三、list的练习四、与vector的对比五、总结 一、list的概念 list 是一种容器,实现了双向链表结构 它具有以下特点: 动态大小,可按需增减元素数量。高效的插入和删除操作,在任意位置插入和…

(四)进入MySQL 【事务】

一、MySQL事务的概念 MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中, 要删除一个人员,即需要删除人员的基本资料,又需要删除和该人员相关的信息,如信箱, 文章等等。…

unity中的InstanceID详解 即Object.GetInstanceID

GetInstanceID 是 Unity 中 Object 类的一个方法,它用于获取一个对象的唯一实例标识符。每个 Unity 对象(如游戏对象、组件、资源等)都有一个唯一的实例 ID,这个 ID 在对象的生命周期内是唯一的。 对于它的生命周期是不确定的。网上说在切换场景或者编辑器关闭重启后会变。…

红黑树刨析(删除部分)

文章目录 红黑树删除节点情景分析情景1:删除节点左右子树都为空情景1.1:删除节点为红色情景1.2:删除节点为黑色情况1.2.1:删除节点的兄弟节点是红色情景1.2.2:删除节点的兄弟节点是黑色情景1.2.2.1:删除节点…

计算机毕业设计选题推荐-大学生竞赛管理系统-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

初识Arduino

什么是Arduino Arduino是一款便捷灵活、方便上手的开源电子原型平台。它包含硬件部分(即各种型号的Arduino板)、软件部分(即Arduino IDE),以及其Arduino社区平台。 Arduino由一个欧洲开发团队于2005年冬季开发&#…

56基于SpringBoot+Vue+uniapp的教学资源库的详细设计和实现(源码+lw+部署文档+讲解等)

文章目录 前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus 系统测试系统测试目的系统功能测试系统测试结论 为什么选择我代码参考数据库参考源码获取源码获取 前言 🌞博主介绍 :✌全网粉丝15W,CSDN特邀作者、21…

信息学奥赛初赛天天练-80-NOIP2015普及组-基础题5-错位排列、二叉树、完全二叉树、叶子节点、完全二叉树叶子节点

NOIP 2015 普及组 基础题5 21 重新排列 1234使得每一个数字都不在原来的位置上,一共有( )种排法 22 一棵结点数为 2015的二叉树最多有( )个叶子结点 2 相关知识点 1) 错位排列 考虑一个有n个元素的排列,若一个排列中所有的元素都不在自己原来的位置…

建模杂谈系列250 Hello2Pymc

说明 pymc算是多年的老朋友了,中间失联了好几年。 内容 1 安装 安装更加麻烦了,不能很好的和其他的环境兼容。在官网上,也是建议用conda的方式安装。 conda create -c conda-forge -n pymc_env "pymc>5" conda activate p…

SQL基础——MySQL的优化

简介:个人学习分享,如有错误,欢迎批评指正。 概述 在应用的的开发过程中,由于初期数据量小,开发人员写 SQL 语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长&…

安卓15发布日期确定,安卓15 谷歌GMS认证截止日期有重大变化!安卓版本GMS认证截止时间更新,谷歌GMS认证之MADA/EDLA设备认证截止时间介绍

谷歌正式公布安卓15发布日期,即9月3号,到时,安卓版本的认证时间将会有改变!以下是深光标准整理的最新安卓版本的到期时间 详细讲解如何看懂这个图 第一列:OS version (API level) 指安卓版本 第二列:AOS…

软件测试工程师必备的技术能力

今年是我从事软件测试工作的第十年,从功能测试进阶到自动化测试,然后负责稳定性测试团队,进而兼任整个质量团队的技术专项治理,再到基础架构团队的测试专家角色,负责多个技术项目的产品/运营和质量保障工作。可以说绝大…

GNU 汇编语法基础

目录 一、引言 二、GNU 汇编基本结构 1.指令格式 2.注释 3. 段 三、寄存器和寻址方式 1.寄存器命名 2.寻址方式 四、指令集 1.数据传送指令 2.算术运算指令 3.逻辑运算指令 4.控制流指令 五、宏和函数 1.宏定义 2. 函数定义 六、总结 一、引言 在嵌入式系统…

南京观海微电子----VCC、 VDD、VSS、VEE 电压符号解释

一般在数据手册或者是说原理图中你会看到VCC、 VDD、VEE、VSS等不同的符号,那它们有什么区别,并且该怎么记住它们呢。 解释一: VCC:电源电压(双极器件);电源电压(74系列数字电路&a…

机会约束转化为确定性约束-- 样本均值法

当涉及到新能源消纳的机会约束规划时,我们需要深入理解其背后的原理和采用的方法。以下是对上文内容的更详细且更贴切的展开解释: 机会约束转化为确定性约束-- 样本均值法代码获取戳此处代码获取戳此处代码获取戳此处 新能源消纳的机会约束 新能源&…

计量校准中溯源方法会有哪些不足之处?

随着新型计量器具的不断涌现,现有的计量检定规程或计量校准规范已不能满足计量溯源的需要。特别是一体化大型设备所配备的传感器,如产业生产线之上的压力传感器、流量计、在线电导率仪、在线酸度计为代表的对传感器的检测目前多依据国家检定规程或计量校…

自制深度学习推理框架之表达式层的设计与实现

文章目录 一、表达式Expression二、词法解析2.1 词法定义2.2 词法解析 三、语法解析3.1 语法树的定义3.2 语法树构建3.3 语法树的转换(逆波兰式) 四、表达式层4.1 ExpressionLayer和ExpressionParser类4.2 表达式层的注册4.3 表达式层的输入处理4.4 表达式层的计算过程 五、计算…