探索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是按照名称注入

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode:376.摆动序列

个人主页:仍有未知等待探索-CSDN博客 专题分栏:算法_仍有未知等待探索的博客-CSDN博客 题目链接:376. 摆动序列 - 力扣(LeetCode) 一、题目 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称…

jsp原理与EL,JSTL表达式基础内容整理

2024年了,vue都到了灌篮高手的版本,真的没想到我还会在这个时间整理一篇关于jsp页面操作的文章。技术就是一个不用就忘的东西,既然工作中还有用武之地,那就整理一下以备不时之需。 长话短说,不展开叙述,只记…

Hive3.1.3基础(续)

参考B站尚硅谷 分区表和分桶表 分区表 Hive中的分区就是把一张大表的数据按照业务需要分散的存储到多个目录,每个目录就称为该表的一个分区。在查询时通过where子句中的表达式选择查询所需要的分区,这样的查询效率会提高很多。 分区表基本语法 分区表…

【linux】Debian挂起和休眠

一、挂起和休眠 在Debian桌面系统中,挂起和休眠是两种不同的状态,它们之间有一些区别。 挂起(Suspend)是将当前系统的状态保存到RAM(内存)中,然后关闭所有硬件设备,除了RAM之外。在…

如何在美国硅谷高防服务器上运行自定义的脚本和应用程序

在美国硅谷高防服务器上运行自定义的脚本和应用程序需要一定的技术和知识。下面我们将介绍一些关键步骤,帮助您顺利地在这些服务器上运行自定义应用程序和脚本。 确保您有对服务器的访问权限,并且已经通过SSH等方式连接到服务器。接下来,您可…

Zabbix交换分区使用率过高排查

Zabbix High swap space usage 问题现象 Zabbix 出现Highswap space usage(less than 50% free)告警,提示交换分区空间使用率超过50% 处理过程 1. 确定swap分区是否已占满 free -h登录Zabbix服务器检查内存情况,检查发现Linux服务器空闲的内存还有不少…

相机与镜头

一、相机视场 相机的视场角,也就是相机能够看到物像角度的最大值,视场角与焦距的关系为像高f*tan(fov/2)。由于相机的感光面是矩形,所以相机能够看到的区域也是矩形。探究相机的视场角,便于分析物面上那些区域属于相机盲区&#x…

宝塔面板一键部署幻兽帕鲁联机服务器教程

幻兽帕鲁是一款深受玩家喜爱的多人在线游戏,玩家可以自行搭建联机服务器,邀请亲朋好友一起在世界探索畅玩,为了方便玩家更快速的部署自己的幻兽帕鲁联机服务器,宝塔面板推出了幻兽帕鲁一键部署服务,一键即可安装并调整…

微信小程序(十九)组件通信(子传父)

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.定义触发事件向父组件传输数据 2.父组件绑定绑定触发事件并获取数据 源码&#xff1a; myNav.wxml <view class"navigationBar custom-class" style"padding-top: {{test}}px;">&l…

Elasticsearch:聊天机器人、人工智能和人力资源:电信公司和企业组织的成功组合

作者&#xff1a;来自 Elastic Jrgen Obermann, Piotr Kobziakowski 让我们来谈谈大型企业人力资源领域中一些很酷且改变游戏规则的东西&#xff1a;生成式 AI 和 Elastic Stack 的绝佳组合。 现在&#xff0c;想象一下大型电信公司的典型人力资源部门 — 他们正在处理一百万件…

关系三元组抽取方案

一、流程概览 先用序列标注模型预测句子中的实体&#xff0c;再对实体&#xff08;加上句子&#xff09;走关系分类模型&#xff0c;预测实体的关系&#xff0c;最后形成有效的三元组。 1、数据标注 2、数据处理 处理原始数据得到ner命名实体识别的训练预测数据和关系抽取训…

CSS 双色拼接按钮效果

<template><view class="sss"><button> <!-- 按钮 --><view class="span"> 按钮 </view> <!-- 按钮文本 --></button></view></template><script></script><style>body {b…

能替代微软AD的国产化方案,搭建自主可控的身份管理体系

随着国产化替代步伐加速&#xff0c;以及企业出于信息安全建设的需要&#xff0c;越来越多的企业和组织开始考虑将现有的微软 Active Directory&#xff08;AD&#xff09;替换为国产化的LDAP身份目录服务&#xff08;也称统一身份认证和管理&#xff09;系统。本文将介绍一种国…

figure方法详解之Figure的创建与配置

figure方法详解之Figure的创建与配置 一 matplotlib.pyplot.figure二 Figure.set_size_inches()三 Figure.set_dpi()四 Figure.set_facecolor()五 Figure.set_edgecolor()六 Figure.set_alpha()七 Figure.set_linewidth()八 总结 在数据可视化中&#xff0c;Matplotlib是一个强…

语义分割(3):损失函数解析

文章目录 1. 常见语义分割损失1.1 Cross Entropy1.2 dice Loss1.2.1 为什么使用Dice loss1.2.2 公式1.2.3 Dice loss 和 F1-score代码 1.3 focal loss1.3.1 公式&#xff1a;1.3.2 代码 2. 语义分割损失应用参考 语义分割任务实际上是一种像素层面上的分类&#xff0c;需要识别…

跨平台Recorder录音插件:支持多种格式、音频可视化、实时上传、语音识别

视频教程地址&#xff1a;【跨平台Recorder录音插件&#xff1a;支持多种格式、音频可视化、实时上传、语音识别】 https://www.bilibili.com/video/BV1jQ4y1c7e4/?share_sourcecopy_web&vd_sourcee66c0e33402a09ca7ae1f0ed3d5ecf7c /** 先引入Recorder &#xff08; 需先…

2024-01-26-redis集群

为什么要搭建集群 高可用性&#xff1a;Redis集群可以提供高可用性&#xff0c;即使其中的一台节点发生故障&#xff0c;其他节点仍然可以继续提供服务。当一个节点下线时&#xff0c;集群会自动将负载均衡到其他可用节点上&#xff0c;从而保证系统的稳定性和可用性。 扩展性…

移动端打包成功后禁止生成 report.html 文件,并不自动打开该文件

目录 【问题】移动端 npm run build 打包后生成并打开 report.html 文件package.json 文件vue.config.js 代码 【解决】打包后去除 report.html 文件vue.config.js 代码 参考 【问题】移动端 npm run build 打包后生成并打开 report.html 文件 package.json 文件 {"name&…

大数据安全 | 期末复习(中)

文章目录 &#x1f4da;感知数据安全⭐️&#x1f407;传感器概述&#x1f407;传感器的静态特性&#x1f407;调制方式&#x1f407;换能攻击&#x1f407;现有防护策略 &#x1f4da;AI安全⭐️&#x1f407;智能语音系统——脆弱性&#x1f407;攻击手段&#x1f407;AI的两…

springboot快速写接口

1. 建proj形式 name会变成文件夹的名字&#xff0c;相当于你的项目名称 基础包 2. 基础依赖 3. 配置数据库 这里要打开mysql&#xff0c;并且创建数据库 方法&#xff1a; 安装好数据库&#xff0c;改好账号密码用navicat来建表和账号配置properties.yml文件即可 4.用res…