当前位置: 首页 > news >正文

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

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍍前端面试宝典 🍉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

在这里插入图片描述


相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python3 logging入门
  • 前端换行、空格的多种表现形式
  • 【Java设计模式】集合管道模式:简化数据操作
  • python-奥运奖牌计数
  • 鸿蒙OS试题(10)
  • vue脚手架的创建
  • 用ASP.NET Core WebApi把ofd文件上传到服务器上处理为pdf文件后返回一个服务器地址
  • Spring Boot 项目中,配合 Nacos 、Gateway使用 MinIO
  • 977.有序数组的平方
  • SpringWeb后端开发-登录认证
  • comfyUI好在哪?为啥大家都在用?
  • android 下拉刷新,androidx.swiperefreshlayout:swiperefreshlayout:1.1.0
  • shell脚本编写注意事项
  • 【Java设计模式】好奇递归模板模式(CRTP):独特地利用多态性
  • 使用Python写一个适用于Dify和FastGPT的JsonPath插件
  • JS 中的深拷贝与浅拷贝
  • @angular/forms 源码解析之双向绑定
  • [译] 怎样写一个基础的编译器
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • C++类中的特殊成员函数
  • miaov-React 最佳入门
  • MySQL主从复制读写分离及奇怪的问题
  • PHP CLI应用的调试原理
  • webpack4 一点通
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 浮动相关
  • 检测对象或数组
  • 马上搞懂 GeoJSON
  • 码农张的Bug人生 - 初来乍到
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 无服务器化是企业 IT 架构的未来吗?
  • 小李飞刀:SQL题目刷起来!
  • 一个JAVA程序员成长之路分享
  • #微信小程序:微信小程序常见的配置传旨
  • (2)STL算法之元素计数
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (汇总)os模块以及shutil模块对文件的操作
  • (六)激光线扫描-三维重建
  • (强烈推荐)移动端音视频从零到上手(下)
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)编辑寄语:因为爱心,所以美丽
  • (转载)(官方)UE4--图像编程----着色器开发
  • .htaccess配置常用技巧
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .NET正则基础之——正则委托
  • .pyc文件是什么?
  • /etc/sudoers (root权限管理)
  • @test注解_Spring 自定义注解你了解过吗?