Spring Boot 自动装配

本篇主要介绍Spring Boot 自动装配的相关内容。

目录

一、什么是自动装配

二、Bean的扫描方式

@ComponentScan

@Import

ImportSelector接口

三、Spring Boot自动装配原理


一、什么是自动装配

在我们在创建Spring Boot项目时往往会根据项目需求,引入很多第三方依赖,在这些依赖中,往往会提供一些类来供我们调用这些依赖,例如Jackson的ObjectMapper类,如果我们要使用这个类只需要引入依赖,然后直接通过注入的方式就能使用。在这个过程中,我们并没有去往容器中存这些Bean,那我们为什么还能够进行注入呢,其实是Spring Boot发挥了作用,它会自动去扫描到这些类,并将其装配到我们的Spring容器中,而这个装配的过程就被称为Spring Boot 的自动装配。

二、Bean的扫描方式

前面我们说了,Spring boot先要去扫描到Bean才能将其装配,那我们要如何才能扫描到Bean呢?下面我们就来介绍一下Bean的两种扫描方式。

@ComponentScan

通过@ComponentScan注解我们可以来指定Spring去哪个包下去扫描Bean,例如,我们想去com.example.config这个包中扫描,只需在会被装配到容器中的类(在配置的扫描的包中有五大类注解标识的类)或启动类上加上这个注解,并在注解中指定即可,具体如下:

我们还可以指定多个包进行扫描,具体如下:

但在一个项目中通常会引入很多依赖,这也就意味着如果我们使用@ComponentScan注解需要指定很多个包来进行扫描,这样不仅会使代码看起来非常繁多和冗余,还会大大加大扫描Bean所需要的时间,还有可能出现启动项目需要几分钟的情况。 下面,我们来介绍另一种扫描Bean的方式。

@Import

@Import注解可以指定要去扫描哪个类,例如我们需要去扫描TestConfig类,只需在启动类或者会被装配到容器中的类(扫描包中五大类注解标识的类或者@Import注解中指定的类)上加上此注解并指定即可,spring就会自动把指定的这个类及其内部的由通过@Bean注解标识的方法所返回的Bean一并加载到Spring容器中,具体代码如下:

但这种方式如果需要扫描多个类的话同样会显得十分繁琐,但与@ComponentScan注解不同的是,使用@Import注解有解决方案,那就是ImportSelector接口。

ImportSelector接口

如果我们传入到@Import注解中的类是ImportSelector接口的实现类,那么该实现类所重写的方法selectImports所返回的String数组将会被加载到@Import注解中,并去扫描数组中对应名称的类。下面我们来创建一个实现类,具体如下, 需要注意的是返回的String数组所包含的是需要扫描的类的全限定包名。

然后我们再将这个实现类写到@Import注解中:

这样当我们在启动项目时,实现类所返回的两个路径的类就会被spring扫描到并加载到容器中了。但要注意的是中这个实现类并不会装配到容器中。

我们将这两个类进行一下注入,代码如下,

启动项目后并未出现问题,这也就意味着前面的两个类都已被正常扫描到并装配了。

这种方式依然还是存在问题,使用这种方式时我们需要去知道所有需要装配的类的名称,这显然是不太可能的,那有没有一种更好的办法呢,其实是有的,我们只需要让第三方依赖给我们提供一个注解,在这个注解中对@Import注解进行封装,并由第三方依赖自行在@Import注解中指定要进行装配的Bean。这样我们就只需要使用第三方依赖提供的这个注解就能去扫描并装配第三方依赖需要装配的Bean了。Spring Boot的自动装配也确实是采取了类似的方式,下面我们来详细了解一下。

三、Spring Boot自动装配原理

Spring Boot自动装配主要与@SpringBootApplication注解有关,该注解的实现如下:

可以发现在这个注解中对@ComponentScan进行了封装 里面的内容大体是指定了当前类所在的包路径为扫描路径,这也就意味着如果我们不自己指定扫描的包的话,会默认以启动类所在包为扫描的包。

然后我们还可以看到一个@SpringBootConfiguration注解,我们进到其实现来看一下

可以看到这个注解的实现非常简单,大体就是将@Configuration注解进行了封装,标识当前启动类为一个配置类,并将其注入到容器中,并且还引入了@Indexed,这个注解主要是让标识的类被更快的扫描到。

然后我们在来看一下@EnableAutoConfiguration注解,这个注解是Spirng Boot自动装配的核心,让我们来具体看一下。

 可以发现在这个注解中对@Import注解进行了封装,并且在注解中指定了一个类,根据名称可以退出这大概是一个ImportSelector接口的实现类。我们进到这个类中看一下,可以发现selectImports方法

在方法中可以看到调用了一个getAutoConfigurationEntry方法,这个方法主要用来获取自动装配的配置类的信息(也就是需要被Import指定扫描的类的信息),我们进到里面来看一下,

 可以发现这个方法中通过getCandidateConfigurations方法获取了一个字符串List,这个List就是需要装配的类的配置类的信息,我们再进到getConfigurations方法来看一下,

在这个方法中,主要是去读取META-INF/spring. factories和META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports.这两个文件中所包含的配置类的信息。

打开这两个文件可以看到依赖所需的所有配置类的全限定包名

然后将读取到的这两个文件的信息经过层层处理后再由前面的selectImports返回给@Imports注解,这样在项目启动时就会去扫描这些相关的配置类,并把其中所包含的由@Bean标注的方法所返回的Bean装配到spring容器中。但这些配置类并不会全部生效,我们进到其中一个配置类来看一下,可以发现在这个配置类上有一个@ConditionalOnClass注解

这个注解的作用是进行一些条件判定,只有符合条件,该配置类对Bean的配置才会生效 

在@EnableAutoConfiguration中还有一个@AutoConfiurationPackage注解这个注解主要是导入AutoConfigurationPackges.register.class这个配置文件,并将启动类所在包中的第三方组件注册到Spring容器中(例如在使用Mybatis时所用到的@Mapper注解标识的类)。

最后总结一下以上述流程,大体如下:

这里介绍的只是Spring Boot自动装配的一个基本流程,完整的流程要远远比这里复杂,如果大家感兴趣的话,可以自己去阅读源码来深入研究。 

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

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

相关文章

OpenCV 轮廓提取总结

0.概述 对于轮廓提取,opencv提供了相关的函数,本文对其使用方法及相关变体做总结。

本地vite启动的vue项目使用nginx代理

前提: 必须在同一网段或者相同的局域网!!! nginx下载通道: https://nginx.org/en/download.html 步骤: 1、最好下载稳定版本: 2、下载后直接解压(注意:解压后不要放…

利用PS在不伤背景的前提下根据颜色去除图像上不想要的内容

下面为一个例子,去除图像上红色的虚线 Step1.用套索工具框选带有颜色的部分 Step2.切换到魔术棒工具,上端选项中,点击与选区交叉,连续这一项不要勾选 Step3.在需要去除的部分点击一下即可在框选范围内选中所有同颜色的区域&#x…

零基础学MySQL

1. 零基础学MySQL 1.1 数据库简介 1.1.1 数据库三层结构 1. 所谓安装Mysql数据库,就是在主机安装一个数据库管理系统(DBMS),这个管理程序可以管理多个数据库。DBMS(database manage system) 2. 一个数据库中可以创建多个表,以保存数据(信息)。 3. 数据…

安卓手机APP开发__支持不同的平台版本

安卓手机APP开发__支持不同的平台版本 目录 概述 指定最小的和目标的API的级别 检查运行时的系统版本 使用平台的风格和主题 概述 当安卓的最新的版本为你的APP提供了很好的API,你应该继续支持安卓的旧版本, 直到更多的设备已经升级为安卓的新版本了.这里展示了你如何利用…

手写Windows文件路径获取小工具

手写Windows文件路径获取小工具 目的 给Windows右键增加功能,右键任何文件(夹)显示复制文件路径的扩展。 效果展示 实现思路 右键调用,自身会把文件路径传递给被调用文件,被调用文件内只需将路径参数复制到剪贴板即…

JavaSE面向对象

面向对象: 所谓面向对象它是针对于面向过程来说的,面向过程是在意执行的流程。而面向对象在意的功能。将一系列的过程封装到一个容器中,我们通过操作这个容器即以对象的方式来进行操作就是面向对象。 类: 类是一类事物的总称&a…

个人微信api

简要描述: 退出群聊 请求URL: http://域名地址/quitChatRoom 请求方式: POST 请求头Headers: Content-Type:application/json Authorization:login接口返回 参数: 参数名 必选 类型 …

中国当代最具影响力的人物颜廷利:死神(死亡)并不可怕,可怕的是…

中国当代最具影响力的人物颜廷利:死神(死亡)并不可怕,可怕的是… 在中国优秀传统文化之中,汉语‘巳’字与‘四’同音,在阿拉伯数字里面,通常用‘4’来表示; 作为汉语‘九’字&#x…

docker(二):Centos安装docker

文章目录 1、安装docker2、启动docker3、验证 官方文档:https://docs.docker.com/engine/install/centos/ 1、安装docker 下载依赖包 yum -y install gcc yum -y install gcc-c yum install -y yum-utils设置仓库 yum-config-manager --add-repo http://mirrors…

Python面试题【python基础部分1-50】

Python面试题【python基础部分1-50】 Python面试题【python基础部分1-50】 Python面试题【python基础部分1-50】 问题:如何在Python中交换两个变量的值? 答案: a, b b, a问题:Python中的列表和元组有什么区别? 答案&…

KAN 笔记

1 Title KAN: Kolmogorov–Arnold Networks(Ziming Liu, Yixuan Wang, Sachin Vaidya, Fabian Ruehle, James Halverson, Marin Soljačić, Thomas Y. Hou, Max Tegmark)【2024】 2 Conclusion Inspired by the Kolmogorov-Arnold representat…

5.10.3 使用 Transformer 进行端到端对象检测(DETR)

框架的主要成分称为 DEtection TRansformer 或 DETR,是基于集合的全局损失,它通过二分匹配强制进行独特的预测,以及 Transformer 编码器-解码器架构。 DETR 会推理对象与全局图像上下文的关系,以直接并行输出最终的预测集。 1. …

【Linux】-Linux的实用操作:快捷键与软件安装操作、构建软连接、日期时区的设置[4]

目录 一、各类小技巧(快捷键) 1、ctrl c 强制停止 2、ctrl d 退出或登出 3、历史命令搜索 4、光标移动快捷键 5、清屏 二、软件安装 1、yum命令 2、apt命令 - 扩展(ubuntu) 三、systemctl命令 四、软连接 1、ln命令…

【字符函数与字符串函数】

文章目录 一、strlen函数1.strlen函数的使用2.strlen函数的模拟实现(1)计算器办法(2)不创建临时变量计数器(3)指针 二、strcpy函数1、strcpy函数的使用2、strcpy函数的模拟实现 三、strcat函数1、strcat函数的使用2、strcat模拟实现3、字符串自己给自己追加? 四、st…

MySQL报错:You can‘t specify target table ‘user‘ for update in FROM clause

一、问题 执行delete语句时,报错“You can’t specify target table ‘user’ for update in FROM clause” 翻译为“不能先select出同一表中的某些值,再update这个表(在同一语句中)”,即delete的目标表不能在其直接子查询中存在&#xff0…

leetcode876-Middle of the Linked List

题目 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:head [1,2,3,4,5] 输出:[3,4,5] 解释:链表只有一个中间结点,值为 …

QML进阶(十六) 元素的布局和定位

文章目录 定位器Row定位Column定位Grid定位Flow定位定位器嵌套布局管理器RowyLayoutColumnLayoutGridLayoutQML有三种布局定位的方式分别为定位器(Item Positioner)、布局管理器(Item Layout)、锚定位(anchor)。锚定位在之前的内容中已经介绍过了,主要用于元素之间相对位置的锚…

Electron Forge | 跨平台实战详解

简介 上篇 介绍了 Electron 和 Electron Builder 的基本用法,本篇将介绍更常用也更方便的打包工具,Electron Forge 。 Electron Forge 是一个为 Electron 应用的开发、打包和分发而设计的全功能工具集。它整合了多个底层 Electron 工具到一个统一的命令…

01-单片机商业项目编程,从零搭建低功耗系统设计

一、引言 这是关于《单片机商业编程之从零搭建低功耗系统》的第一篇章,个人善忘,平常项目设计当中的一些思路,以前年轻的时候习惯性的录制成视频,也算是当作是自己的笔记,无奈现在喉咙实在扛不住,因此先尝试…