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自动装配的一个基本流程,完整的流程要远远比这里复杂,如果大家感兴趣的话,可以自己去阅读源码来深入研究。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring高手之路18——从XML配置角度理解Spring AOP

文章目录 1. Spring AOP与动态代理1.1 Spring AOP和动态代理的关系1.2 AOP基本术语 2. 通过XML配置实现Spring AOP2.1 添加Spring依赖2.2 定义业务接口和实现类2.3 定义切面类2.4 配置XML 1. Spring AOP与动态代理 1.1 Spring AOP和动态代理的关系 Spring AOP使用动态代理作为…

AI 问答 API 对接说明

我们知道,市面上一些问答 API 的对接还是相对没那么容易的,比如说 OpenAI 的 Chat Completions API,它有一个 messages 字段,如果要完成连续对话,需要我们把所有的上下文历史全部传递,同时还需要处理 Token…

Matlab/simulink永磁直驱风机的建模仿真

Matlab/simulink直驱永磁同步风机的建模仿真,跟随风速波动效果好,可以作为后期科研的基础模型

【recast-navigation-js】通过websocket获取navmesh数据并初始化

目录 说在前面目录结构websocket服务器前端结果 说在前面 操作系统:windows 11浏览器:edge版本 124.0.2478.97recast-navigation-js版本:0.29.0golang版本:1.21.5 目录结构 D:. │ go.mod │ go.sum │ main.go // websocket …

电视剧电影原声背景音乐,经典影视配乐片段音效合集

一、素材描述 本套影视配乐素材,大小1.89G,27个压缩文件。 二、素材目录 宰相刘罗锅配乐片段.rar 影视配乐65首.rar 太极张三丰原声.rar 东邪西毒原声配乐15首.rar 东方不败之风云再起配乐24首.rar 东方不败原声配乐16首.rar 电影大话西游原声配…

Ubuntu18.04解决有线网卡连接问题(不更新内核成功版)

https://www.realtek.com/Download/List?cate_id584 (需要翻一下) 不想自己去下载,直接去我资源里下载我上传的包就好啦(😂😂😂刚刚看了下别人下载要VIP还是自己去网站下很快的) 下载后解压,在…

Spring MVC(建立连接 + 请求)

文章目录 一、建立客户端和服务器的连接二、如何构造请求(传参)2.1 构造请求方式 参数通用注解2.2 传递单个参数2.3 传递多个参数2.4 传递数组/集合2.5 传递对象2.6 传递JSON 三、相关的其他请求操作3.1 获取URL中的参数 PathVariable3.2 上传文件 Requ…

HCIP-Datacom-ARST自选题库_07_割接【35道题】

一、单选题 1.在割接的测试阶段,符合以下哪一种情况的可以判断为割接成功? 网络承载的上层应用业务测试正常 网络设备的配置查看结果正常 网络流量路径正常 路由协议运行正常 2.在割接的测试阶段中,表明已经完成测试的标准是: IP设备的配置查看结…

Docker 直接运行一个 Alpine 镜像

由于镜像很小,下载时间往往很短,读者可以直接使用 docker run 指令直接运行一个 Alpine 容器,并指定运行的 Linux 指令,例如: PS C:\Users\yhu> docker run alpine echo 123 Unable to find image alpine:latest lo…

QTreeView学习 branch 虚线设置

1、方法一&#xff1a; #include <QStyleFactory> ui.treeView->setStyle(QStyleFactory::create("windows")); 2、方法二&#xff1a; QString strtyle2 R"( QTreeView::branch:has-siblings:!adjoins-item { border-image: url(:/TreeViewDe…

Nios-II编程

文章目录 一硬件部分设计1Qsys2Quartus 二软件1Nios-II Eclipse 三运行项目及效果1配置 FPGA 一硬件部分设计 1Qsys 1创建一个项目 2点击 Tools 下拉菜单下的 Platform Designer 工具&#xff0c;启动 Platform Designer 后&#xff0c;点击 File-save&#xff0c;在文件名中…

易图讯智慧公安警用三维电子沙盘系统

智慧公安警用三维电子沙盘系统是一个结合现代科技手段&#xff0c;为公安部门提供全面、高效、智能的警务管理解决方案的系统。该系统以“情报大数据、指挥扁平化、勤务可视化、情指勤一体化”为设计思想&#xff0c;整合了多台设备、有无线通讯、短信平台、天网、交通平台、治…

活字格中如何打开指定文件夹

如何使用活字格打开指定文件夹 活字格是一款功能强大的电子表格软件&#xff0c;除了基本的表格计算功能之外&#xff0c;还提供了丰富的扩展功能&#xff0c;可以用来实现各种自动化操作。例如&#xff0c;我们可以使用活字格来打开指定的文件夹。 以下是具体的操作步骤&…

重学JavaScript高阶知识点(三)—— 详解Js中的内存管理

详解Js中的内存管理 1. 简介2. 内存生命周期3. JavaScript 的内存分配4. 垃圾回收 1. 简介 很多底层语言一般都有底层的内存管理接口&#xff0c;比如 C语言&#xff0c;可以调用对应的API去创建和释放内存空间。意思是需要手动去创建和释放内存空间&#xff0c;很明显&#x…

【C++11】列表初始化、右值引用的详细讲解(上)

前言 在一开始学C之前我们就简单的了解了一下C的发展历史。 相比较而言&#xff0c;C11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全&#xff0c;不仅功能更强大&#xff0c;而且能提升程序员的开发效率加了许多特性&#xff0c;约140个新特性。使得C…

电商核心技术揭秘55:社群与粉丝经济的结合

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 电商技术揭秘四十一&#xff1a;电商平台的营销系统浅析 电商技术揭秘四十二&#…

OpenAI下周发布更新;TikTok将自动标记AIGC;智谱AI亮相2024 ICLR

OpenAI 官宣下周举办直播发布更新 OpenAI 今日凌晨官宣&#xff0c;将在当地时间 5 月 13 日上午十点&#xff08;北京时间 5 月 14 日凌晨两点&#xff09;在官网进行直播&#xff0c;届时将演示一些 ChatGPT 和 GPT-4 的更新。 OpenAI CEO Sam Altman 补充表示&#xff0c;届…

【论文润色心得】博士生的福音来啦!

&#x1f31f;【论文润色心得】博士生的福音来啦&#xff01;&#x1f393; &#x1f4da; 投稿屡遭拒绝&#xff1f;语言关难过&#xff1f;看这里&#xff0c;我找到了解决之道&#xff01;&#x1f469;‍&#x1f3eb; &#x1f4a1; 我的润色经历&#xff0c;从拒稿到接…

springboot整合rabbitmq的不同工作模式理解

前提是已经安装并启动了rabbitmq&#xff0c;并且项目已经引入rabbitmq&#xff0c;完成了配置。 不同模式所需参数不同&#xff0c;生产者可以根据参数不同使用重载的convertAndSend方法。而消费者均是直接监听某个队列。 不同的交换机是实现不同工作模式的关键组件.每种交换…

excel常见图表大全

Excel图表是一种以图形形式呈现数据的工具&#xff0c;它将数字和统计信息转化为直观的视觉元素&#xff0c;如线图、柱状图、饼图等。这些图表可以帮助人们更容易地理解数据的趋势、关系和模式。 使用场景 Excel图表广泛应用于各个领域&#xff0c;包括&#xff1a; 商务分…