SpringBoot自动装配原理及分析

news2024/11/17 14:20:59

一、什么是自动装配

在使用SpringBoot的时候,会自动将Bean装配到IoC容器中。例如我们在使用Redis数据库的时候,会引入依赖spring-boot-starter-data-redis。在引入这个依赖后,服务初始化的时候,会将操作Redis需要的组件注入到IoC容器中进行后续使用

自动装配大致过程如下:

获取到组件(例如spring-boot-starter-data-redis)META-INF文件夹下的spring.factories文件

spring.factories文件中列出需要注入IoC容器的类

将实体类注入到IoC容器中进行使用

二、自动装配原理

自动装配大致流程是通过@SpringBootApplication进行实现,这个注解声明在SpringBoot的启动类上

1、SpringBoot启动类

2、@SpringBootApplication注解

SpringBoot启动类=>@SpringBootApplication

3、@SpringBootConfiguration注解

SpringBoot启动类=>@SpringBootApplication=>@SpringBootConfiguration

通过@SpringBootConfiguration注解标识SpringBootApplication是一个SpringBoot配置类

@AliasFor注解用于为注解属性声明别名(@SpringBootApplication注解也有@AliasFor注解)

4、@EnableAutoConfiguration注解

SpringBoot启动类=>@SpringBootApplication=>@EnableAutoConfiguration

通过@EnableAutoConfiguration注解实现自动装配

5、@AutoConfigurationPackage注解SpringBoot启动类=>@SpringBootApplication=>@EnableAutoConfiguration=>@AutoConfigurationPackage

通过@AutoConfigurationPackage注解将添加该注解的类所在的package作为自动配置package进行管理

通过AutoConfigurationPackages工具类获取自动配置package列表,也就是说当SpringBoot应用启动时默认会将启动类所在的package作为自动配置的package

6、@EnableAutoConfiguration注解最重要的是AutoConfigurationImportSelector.class,将需要装配的类装配到IoC容器中,下面重点分析一下这个类的实现

三、核心类分析

1、selectImport方法

AutoConfigurationImportSelector中的selectImport方法是自动装配的核心实现,它主要是读取META-INF/spring.factories文件,经过去重、过滤,返回需要装配的配置类集合

2、getAutoConfigurationEntry方法

selectImport方法=>getAutoConfigurationEntry方法

getAttributes方法:获取@EnableAutoConfiguration中的exclude、excludeName等

getCandidateConfigurations方法:获取所有自动装配的配置类,也就是读取spring.factories文件,后面会再次说明

removeDuplicates方法:去除重复的配置项

getExclusions方法:根据@EnableAutoConfiguration中的exclude、excludeName移除不需要的配置类

fireAutoConfigurationImportEvents方法:广播事件

最后根据多次过滤、判重返回配置类合集

3、getCandidateConfigurations方法

selectImport方法=>getAutoConfigurationEntry方法=>getCandidateConfigurations方法

通过loadFactoryNames方法,扫描classpath下的META-INF/spring.factories文件,里面是以key=value形式存储,读取其中key=EnableAutoConfiguration,value就是需要装配的配置类,也就是getCandidateConfigurations返回的值

四、总结

1)通过注解@SpringBootApplication=>@EnableAutoConfiguration=>@Import({AutoConfigurationImportSelector.class})实现自动装配

2)AutoConfigurationImportSelector类中重写了ImportSelector中selectImports方法,批量返回需要装配的配置类

3)通过Spring提供的SpringFactoriesLoader机制,扫描classpath下的META-INF/spring.factories文件,读取需要自动装配的配置类

4)依据条件筛选的方式,把不符合的配置类移除掉,最终完成自动装配

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

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

相关文章

给你下单前,磨练你无数次的国外客户

前段时间给几个客户做了不少方案设计和报价后都没有下文,给我做项目的设计师都对我没信心了,多少有点抱怨,就说我是雷声大雨点小。再有要做设计的图,就不会像之前那样热心了。 说真的,多少有点受挫。前天那个咨询了无…

log4j2 日志保存至数据库

文章目录 概述一、springmvc工程1.创建数据库日志表2.log4j2.xml引入JDBCAppender3.定义日志管理类4.编写日志输出代码5.运行结果6.完整代码 二、springboot工程1. 创建数据库日志表2.log4j2.xml引入JDBCAppender3.定义日志管理类4. 遗留问题5. 解决办法6. 完整代码 概述 Apac…

求臻医学:结直肠癌患者必看的就诊指南及基因检测意义

结直肠癌是常见的消化道肿瘤之一,已跃居我国高发恶性肿瘤第2位,且其发病率、死亡率逐年上升。数据显示,2020年新发病例 55.5 万,死亡病例 28.6 万。本文系统归纳总结了结直肠癌患者应该选择哪些诊科室、相关检查、治疗方式、预后预…

数字IC设计系列----单端口RAM、双端口RAM、同步FIFO、异步FIFO

一、单端口RAM原理及实现 1.1、概念/原理 在内存空间中开辟出一段固定大小的内存用于存储数据,每一个数据所占的bit位称之为位宽,这段内存空间中数据的总数称之为深度。例如reg [7:0] mem [255:0],这段内存空间中每一个数据的位宽为8bit&am…

VS2019中使用printf函数报错处理方法

VS2019中使用printf函数报错处理方法 在使用vs2019学习OpenCV的过程中,使用简单的printf函数,竟然编译不过去,VS2019报错; 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C4996 ‘sprintf’: This function or variable may…

基础概念回顾:云原生应用交付

原文链接:基础概念回顾:云原生应用交付 转载来源:NGINX 开源社区 NGINX 唯一中文官方社区 ,尽在 nginx.org.cn 尽管云原生应用开发诞生于 21 世纪初,但是在术语使用方面还是非常混乱。本文将带您了解常见的术语和问题。…

图像处理领域之►边缘检测大合集◄【应该是全网仅有的了吧】

图像处理领域之►边缘检测‧大合集◄ 概述 {\color{Brown}概述} 概述 数据集 {\color{Purple}数据集} 数据集 实践 {\color{Red}实践} 实践 深度学习方法 {\color{Blue} 深度学习方法} 深度学习方法 机器学习方法 {\color{Blue} 机器学习方法} 机器学习方法 基于传统方法 {\col…

如何隐藏或修改Docker容器中的Nginx响应头中的Server

背景介绍 现在大部分项目通过Nginx作为反向代理,实际由于安全审计要求需要隐藏或修改响应头的Server信息,传统的项目直接部署在nginx服务器中,只需要在nginx服务器安装ngx_http_headers_more_filter_module插件,然后通过修改ngin…

Linux服务器占用处理手记

磁盘占用定位处理 查看磁盘占用情况: df -h 查看每个目录的占用情况: du -h -x --max-depth1 查找大文件和目录 du -sh /* du -sh /home/* 可参考: Linux垃圾清理指北_linux 清理垃圾_智商二五零_的博客-CSDN博客 查看CPU和内存占用情…

SpringBoot底层原理----配置优先级/Bean管理/springboot原理

配置优先级 最终得到以下配置优先级:(从低到高) Bean管理 获取bean bean作用域 第三方bean Springboot原理 起步依赖 原理就是依赖传递-通过引入web依赖将所有必要的都同时引入 自动配置--面试高频题目 即:在pom文件中引入依赖后,他是如何自动配置给IOC容器的 springboot采…

Xilinx SDK编译完成自动生成SREC文件(适用于ISE、Vivado、Vitis)

把elf转换成srec格式的常规方式,是打开Program Flash Memory界面,选择elf文件,点击Convert ELF to SREC 会在hardware目录下的cache文件夹下生产srec文件。 可以通过配置编译后执行命令,在每次编译完成自动生产srec文件。 会在…

安卓备份基带分区 备份字库 步骤解析 以免误檫除分区或者“格机” 后悔莫及

玩机搞机---安卓机型mtk和高通芯片查看分区 导出分区 备份分区的一些工具分析 修复基带 改串码 基带qcn 改相关参数 格机危害 手机基带的重要性前面几期博文我都有相关的说明。他区别于别的分区。而且目前手机的安全性越来越高。基带分区基本都是专机专用。而不像早期机型一…

小皮面板配置Xdebug,调用单个php文件

小皮面板配置Xdebug 首先下载phpstrom,和小皮面板 打开小皮面板,选中好要使用的php版本 然后点击【管理】> 【php扩展】> 【xdebug】 然后打开选中好版本的php位置 D:\Program_Files\phpstudy_pro\Extensions\php\php7.4.3nts打开php.ini文件…

【数据结构】—从直接插入排序升级到希尔排序究极详解(含C语言实现)

食用指南:本文在有C基础的情况下食用更佳 🔥这就不得不推荐此专栏了:C语言 ♈️今日夜电波:透明で透き通って何にでもなれそうで—HaKU 2:05 ━━━━━━️💟──────── 5:38 …

干货分享 | 关于同星硬件接口卡及TSMaster软件常见问题QA指南

TSMaster是同星智能开发的一款国产汽车总线工具链软件平台,是全方位汽车总线设计、仿真、分析、诊断和标定的专业工具,支持从需求分析到系统实现的整个系统开发过程。同星智能硬件接口卡可以提供CAN, CAN FD, LIN, FlexRay, 与Ethernet等网络的开发、仿真…

李宏毅-hw7-利用Bert完成QA

一、查漏补缺、熟能生巧: 只有熬过不熟练的时期,反复琢磨,才会有熟练之后,藐视众生的时刻 1.关于transformers中的tokenizer的用法的简单介绍: from transformers import BertTokenizerFast# 加载预训练的BERT模型to…

uniapp Echart X轴Y轴文字被遮挡怎么办,或未能铺满整个容器

有时候布局太小,使用echarts,x轴y轴文字容易被遮挡,怎么解决这个问题呢,或者是未能铺满整个容器。 方法1: 直接设置 containLabel 字段 options: { grid: { containLabel: true, },} 方法2: 间接设置,但是…

微信小程序页面栈超出导致页面卡死

微信小程序页面栈不能超出10个 超出10个之后无法进行点击选择跳转 解决方法: 跳转的时候,判断之前页面栈里是否存在要跳转的页面, 如果存在之前页面,就navigateBack返回之前页面, 如果不存在之前页面,判断…

RocketMQ 核心编程模型以及生产环境最佳实践

文章目录 1、RocketMQ的消息模型2、深入理解RocketMQ的消息模型2.1、RocketMQ客户端基本流程2.2、消息确认机制2.2.1、 发送消息的方式第一种称为单向发送第二种称为同步发送第三种称为异步发送 2.2.2、状态确认机制2.2.3、消费者也可以自行指定起始消费位点 2.3、广播消息2.4、…

nginx 报错[emerg]: unknown directive “锘? in E:\nginx-1.18.0/conf/nginx.conf:3

报错:nginx 报错[emerg] 32408#14080: unknown directive "锘? in E:\nginx-1.18.0/conf/nginx.conf:3 原因:使用nginx服务时,用txt记事本打开编辑了nginx.conf文件,类似WINDOWS自带的记事本等软件,在保存一个以…