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

探索IOC和DI:解密Spring框架中的依赖注入魔法

IOC与DI的详细解析

  • IOC详解
    • 1 bean的声明
    • 2 组件扫描
  • DI详解

IOC详解

1 bean的声明

IOC控制反转,就是将对象的控制权交给Spring的IOC容器,由IOC容器创建及管理对象。IOC容器创建的对象称为bean对象。

要把某个对象交给IOC容器管理,需要在类上添加一个注解:@Component

而Spring框架为了更好的标识web应用程序开发当中,bean对象到底归属于哪一层,又提供了@Component的衍生注解:

  • @Controller (标注在控制层类上)
  • @Service (标注在业务层类上)
  • @Repository (标注在数据访问层类上)

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

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

查看源码:在这里插入图片描述

在IOC容器中,每一个Bean都有一个属于自己的名字,可以通过注解的value属性指定bean的名字。如果没有指定,默认为类名首字母小写。

在这里插入图片描述

注意事项:

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

2 组件扫描

问题:使用前面学习的四个注解声明的bean,一定会生效吗?

答案:不一定。(原因:bean想要生效,还需要被组件扫描)

下面我们通过修改项目工程的目录结构,来测试bean对象是否生效:

在这里插入图片描述

运行程序后,报错:

在这里插入图片描述

为什么没有找到bean对象呢?

  • 使用四大注解声明的bean,要想生效,还需要被组件扫描注解@ComponentScan扫描

@ComponentScan注解虽然没有显式配置,但是实际上已经包含在了引导类声明注解 @SpringBootApplication 中,默认扫描的范围是SpringBoot启动类所在包及其子包

在这里插入图片描述

  • 解决方案:手动添加@ComponentScan注解,指定要扫描的包 (仅做了解,不推荐

在这里插入图片描述

推荐做法(如下图):

  • 将我们定义的controller,service,dao这些包呢,都放在引导类所在包com.itheima的子包下,这样我们定义的bean就会被自动的扫描到

在这里插入图片描述

DI详解

依赖注入,是指IOC容器要为应用程序去提供运行时所依赖的资源,而资源指的就是对象。

在程序中,我们使用@Autowired这个注解,完成了依赖注入的操作,而这个Autowired翻译过来叫:自动装配。

@Autowired注解,默认是按照类型进行自动装配的(去IOC容器中找某个类型的对象,然后完成注入操作)

入门程序举例:在EmpController运行的时候,就要到IOC容器当中去查找EmpService这个类型的对象,而我们的IOC容器中刚好有一个EmpService这个类型的对象,所以就找到了这个类型的对象完成注入操作。

那如果在IOC容器中,存在多个相同类型的bean对象,会出现什么情况呢?

在这里插入图片描述

  • 程序运行会报错

在这里插入图片描述

如何解决上述问题呢?Spring提供了以下几种解决方案:

  • @Primary

  • @Qualifier

  • @Resource

使用@Primary注解:当存在多个相同类型的Bean注入时,加上@Primary注解,来确定默认的实现。

在这里插入图片描述

使用@Qualifier注解:指定当前要注入的bean对象。 在@Qualifier的value属性中,指定注入的bean的名称。

  • @Qualifier注解不能单独使用,必须配合@Autowired使用

在这里插入图片描述

使用@Resource注解:是按照bean的名称进行注入。通过name属性指定要注入的bean的名称。

在这里插入图片描述

面试题 : @Autowird 与 @Resource的区别

  • @Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解
  • @Autowired 默认是按照类型注入,而@Resource是按照名称注入

后记
👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹

相关文章:

  • 基于51单片机智能电子秤
  • 《vtk9 book》 官方web版 第2章 - 面向对象设计
  • jenkins安装配置,使用Docker发布maven项目全过程记录(1)
  • git checkout和git switch的区别
  • 微信小程序(十五)自定义导航栏
  • 定向减免!函数计算让轻量 ETL 数据加工更简单,更省钱
  • 那些年与指针的爱恨情仇(一)---- 指针本质及其相关性质用法
  • C# 只读文件删除提示失败,给文件修改属性
  • 【论文笔记】《Learning Deconvolution Network for Semantic Segmentation》
  • YOLOv8加入AIFI模块,附带项目源码链接
  • JSON-handle工具安装及使用
  • 2024年可能会用到的几个地图可视化模板
  • 五、详细设计说明书(软件工程)
  • three.js 鼠标选中模型弹出标签
  • Spring Boot3整合Druid(监控功能)
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • ES6之路之模块详解
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • java小心机(3)| 浅析finalize()
  • js正则,这点儿就够用了
  • Laravel 菜鸟晋级之路
  • LeetCode18.四数之和 JavaScript
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Octave 入门
  • PAT A1017 优先队列
  • QQ浏览器x5内核的兼容性问题
  • 开发基于以太坊智能合约的DApp
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 原生Ajax
  • 2017年360最后一道编程题
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​什么是bug?bug的源头在哪里?
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)http-server应用
  • (转)平衡树
  • **python多态
  • .net core Swagger 过滤部分Api
  • .net Signalr 使用笔记
  • .NET/C# 使用反射注册事件
  • .Net6 Api Swagger配置
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • //解决validator验证插件多个name相同只验证第一的问题
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • [ Algorithm ] N次方算法 N Square 动态规划解决