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,一经查实,立即删除!

相关文章

本地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. 数据…

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

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

个人微信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…

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…

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

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

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第一周) - 自然语言处理介绍和线性分类

自然语言处理介绍和线性分类 1. 自然语言处理介绍2. 线性二分类3. 情感分析和基础特征提取 3.1. 情感分析3.2. 特征提取3.3. 文本预处理 4. 学习的基础-梯度下降算法5. 感知机6. 逻辑回归7. 情感分析8. 感知机和逻辑回归 1. 自然语言处理介绍 自然语言处理的目标是什么 能够解…

(2024,KAN,MLP,可训练激活函数,样条函数,分层函数)Kolmogorov–Arnold 网络

KAN: Kolmogorov–Arnold Networks 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 1. 简介 2. KAN 2.1 KA 表示定理 2.2 KAN 架构 2.3 KAN 的逼近能力和缩放定律 2.4 对于…

国产操作系统下使用dpkg命令管理软件包 _ 统信 _ 麒麟 _ 中科方德

往期好文:国产操作系统下Chrome的命令行使用 | 统信 | 麒麟 Hello,大家好啊!在Linux系统中,dpkg是Debian包管理系统的基础命令工具,它允许用户安装、卸载、查询和管理软件包。在国产操作系统如统信UOS和麒麟KOS、中科方…

字节码基础

基本概念 java中的字节码,英文bytecode。是java代码编译后的中间代码格式。JVM需要读取并解析字节码才能执行相应的任务。java字节码是JVM的指令集。JVM加载字节码格式的class文件。校验之后通过JIT编译器转换成本机机器代码执行。 java字节码简介 1、java byteco…

阿里云部署ChatGLM-6B及ptuning微调教程

一、模型部署 1.进入阿里云人工智能平台PAI。 2.申请免费试用。 3.打开交互式建模 PAI-DSW。 4.新建实例。 5.填写配置。 6.实例准备完成后点击打开。 7.打开实例后点击Teminal。 8.在Teminal中依次输入以下命令并执行。 apt-get update apt-get install git-lfs git lfs ins…

SQLite利用事务实现批量插入(提升效率)

在尝试过SQLite批量插入一百万条记录,执行时长高达20多分钟后,就在想一个问题,这样的性能是不可能被广泛应用的,更不可能出现在真实的生产环境中,那么对此应该如何优化一下呢? 首先分析一下批量插入的逻辑 …

蓝桥杯-地宫取宝

X 国王有一个地宫宝库,是 nm 个格子的矩阵,每个格子放一件宝贝,每个宝贝贴着价值标签。 地宫的入口在左上角,出口在右下角。 小明被带到地宫的入口,国王要求他只能向右或向下行走。 走过某个格子时,如果那个…

网络工程师----第二十四天

计算机基础 第一章:概述 互联网的组成: (1)边缘部分:由所有连接在互联网上的主机组成。这部分是用户直接使用的,用来进行通信(传送数据、音频或视频)和资源共享。 (2…