08、SpringBoot 源码分析 - 自动配置深度分析一

news/2024/7/20 17:06:50/文章来源:https://blog.csdn.net/weixin_42081445/article/details/139115145

SpringBoot 源码分析 - 自动配置深度分析一

  • refresh和自动配置大致流程
  • 如何自动配置
  • SpringBootApplication注解
    • EnableAutoConfiguration注解
      • AutoConfigurationImportSelector自动配置导入选择器
      • DeferredImportSelectorHandler的handle
      • DeferredImportSelectorGroupingHandler的register注册DeferredImportSelectorHolder
      • DeferredImportSelectorGrouping

refresh和自动配置大致流程

在这里插入图片描述

如何自动配置

我们看下这段代码,红色框是什么放入的注册类,其实这就是我们要注册的配置类,自动装配跟他有关:

public static void main(String[] args) {SpringApplication.run(SpringBootLearnApplication.class, args);}

为什么呢,因为他头上有注解 SpringBootApplication

@SpringBootApplication
public class SpringBootLearnApplication

所以其实你只要传一个头上有这个注解的类就可以了,不一定要是main方法的类。

SpringBootApplication注解

那为什么就有这个注解就能自动配置呢,我们来看看这个注解,其他你可以不管,但是EnableAutoConfiguration你得看:
在这里插入图片描述
首先这个是一个配置类,可以被解析,因为有SpringBootConfiguration注解,被Configuration注解了:
在这里插入图片描述
这样我们的SpringBootApplication就类似于我们经常配置的java配置类。有了这个前提,我们就可以先看这个配置类的解析过程,其实就是ConfigurationClassPostProcessor的解析处理,解析流程我以前的spring源码文章都讲过,其中processImports的处理也特别讲过,会先递归获取所有import进来的类,然后按不同类型进行判断处理,重点就是这里啦,我们先来看下EnableAutoConfiguration注解是不是有import呢。

EnableAutoConfiguration注解

在这里插入图片描述
有个AutoConfigurationImportSelectorimport,其实还有一个在AutoConfigurationPackage注解里,暂时不说,重点是AutoConfigurationImportSelector

AutoConfigurationImportSelector自动配置导入选择器

看下他的结构,左边不用管,就是为了回调拿到一些属性,好对容器操作,主要是右边,我们前面spring的文章讲过ImportSelector的原理,想看的朋友可以看下这篇文章,有这个基础对下面的理解比较好,因为这里还有个DeferredImportSelector,他会在ConfigurationClassParser解析方法的最后来处理。
在这里插入图片描述
可以看到,他被处理的时候:
在这里插入图片描述
DeferredImportSelectorHandler就是专门来处理这些DeferredImportSelector的。

DeferredImportSelectorHandler的handle

首先会封装一个持有器DeferredImportSelectorHolder,如果deferredImportSelectors为空,表示在被DeferredImportSelectorGroupingHandler处理中,DeferredImportSelectorGroupingHandler又是什么呢,其实我们要处理的DeferredImportSelectorHolder会根据Group进行分组,来区分不同的ImportSelector,比如我们这个自动装配的AutoConfigurationImportSelector,是属于AutoConfigurationGroup类型的,分组处理方便,到时候只需要遍历所有组中的ImportSelector统一处理即可。因为处理的方式是迭代器循环,所以不能添加,只能直接处理,当然如果不为空,表示没有在处理,可以添加到deferredImportSelectors集合里。

		public void handle(ConfigurationClass configClass, DeferredImportSelector importSelector) {DeferredImportSelectorHolder holder = new DeferredImportSelectorHolder(configClass, importSelector);if (this.deferredImportSelectors == null) {//直接处理DeferredImportSelectorGroupingHandler handler = new DeferredImportSelectorGroupingHandler();handler.register(holder);handler.processGroupImports();}else {this.deferredImportSelectors.add(holder);//添加}}

DeferredImportSelectorGroupingHandler的register注册DeferredImportSelectorHolder

可以看到组处理器里面会有一个groupings 映射,就是来存放Group类别和DeferredImportSelectorGrouping映射的,同一个Group类别里面可以很多个DeferredImportSelectorGrouping,因为DeferredImportSelectorGrouping里面有集合。

		//自动装配类型和组映射private final Map<Object, DeferredImportSelectorGrouping> groupings = new LinkedHashMap<>();//注解属性和配置类的映射private final Map<AnnotationMetadata, ConfigurationClass> configurationClasses = new HashMap<>();//注册分组public void register(DeferredImportSelectorHolder deferredImport) {Class<? extends Group> group = deferredImport.getImportSelector().getImportGroup();DeferredImportSelectorGrouping grouping = this.groupings.computeIfAbsent((group != null ? group : deferredImport),key -> new DeferredImportSelectorGrouping(createGroup(group)));//创建组grouping.add(deferredImport);//创建一个组,并加入DeferredImportSelectorHolderthis.configurationClasses.put(deferredImport.getConfigurationClass().getMetadata(),deferredImport.getConfigurationClass());//将注解属性和ConfigurationClass映射}

DeferredImportSelectorGrouping

这里就是同一个组的会添加进deferredImports集合。
在这里插入图片描述
其实是比较绕的,绕了几层,我画个图看了清晰:
在这里插入图片描述

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

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

相关文章

【Qt】Qt框架文件处理精要:API解析与应用实例:QFile

文章目录 前言&#xff1a;1. Qt 文件概述2. 输入输出设备类3. 文件读写类3.1. 打开open3.2. 读read / readline/ readAll3.3. 写write3.4. 关闭close 4. 读写文件示例5. 文件件和目录信息类总结&#xff1a; 前言&#xff1a; 在现代软件开发中&#xff0c;文件操作是应用程序…

【git】开发提交规范(feat、fix、perf)

这段时间收到的需求很多&#xff0c;可能是临近两周一次的大版本灰度上线&#xff0c;这次产生了一个关于git的思考&#xff0c;就是各个版本之间怎么管理的问题&#xff0c;这里做出我自己的一些方法。 首先&#xff0c;既然已经明确了remote分支中的release分支为主分支&…

如何设置远程桌面连接?

远程桌面连接是一种方便快捷的远程访问工具&#xff0c;可以帮助用户在不同地区间快速组建局域网&#xff0c;解决复杂网络环境下的远程连接问题。本文将针对使用远程桌面连接的操作步骤进行详细介绍&#xff0c;以帮助大家快速上手。 步骤一&#xff1a;下载并安装远程桌面连接…

文件上传漏洞:pikachu靶场中的文件上传漏洞通关

目录 1、文件上传漏洞介绍 2、pikachu-client check 3、pikachu-MIME type 4、pikachu-getimagesize 最近在学习文件上传漏洞&#xff0c;这里使用pikachu靶场来对文件上传漏洞进行一个复习练习 废话不多说&#xff0c;开整 1、文件上传漏洞介绍 pikachu靶场是这样介绍文…

前端Vue自定义顶部搜索框:实现热门搜索与历史搜索功能

前端Vue自定义顶部搜索框&#xff1a;实现热门搜索与历史搜索功能 摘要&#xff1a; 随着前端开发复杂性的增加&#xff0c;组件化开发成为了提高效率和降低维护成本的有效手段。本文介绍了一个基于Vue的前端自定义顶部搜索框组件&#xff0c;该组件不仅具备基本的搜索功能&am…

记录一次内存取证

1.情景复现 我姐姐的电脑坏了。我们非常幸运地恢复了这个内存转储。你的工作是从系统中获取她所有的重要文件。根据我们的记忆&#xff0c;我们突然看到一个黑色的窗口弹出&#xff0c;上面有一些正在执行的东西。崩溃发生时&#xff0c;她正试图画一些东西。这就是我们从崩溃…

SQL——SELECT相关的题目(力扣难度等级:简单)

目录 197、上升的温度 577、员工奖金 586、订单最多的客户 596、超过5名学生的课 610、判断三角形 620、有趣的电影 181、超过经理收入的员工 1179、重新格式化部门表&#xff08;行转列&#xff09; 1280、学生参加各科测试的次数 1965、丢失信息的雇员 1068、产品销售分…

微信小程序基础 -- 小程序UI组件(5)

小程序UI组件 1.小程序UI组件概述 开发文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/framework/view/component.html 什么是组件&#xff1a; 组件是视图层的基本组成单元。 组件自带一些功能与微信风格一致的样式。 一个组件通常包括 开始标签 和 结…

SEO优化,小白程序员如何做SEO优化流量从0到1

原文链接&#xff1a;SEO优化&#xff0c;小白程序员如何做SEO优化流量从0到1 1、SEO是什么&#xff1f; SEO即&#xff1a;搜索引擎优化(Search Engine Optimization)&#xff0c;是一种通过优化网站结构、内容和外部链接等因素&#xff0c;提高网站在搜索引擎中的自然排名&…

防止特权升级攻击的有效策略

防止特权升级攻击的有效策略 特权升级攻击是一种通过利用操作系统或应用程序中的编程错误、漏洞、设计缺陷、配置错误或访问控制缺陷&#xff0c;获得对原本应该被限制访问的资源进行未授权访问的行为。这种攻击方式可能导致攻击者获取敏感数据、安装恶意软件并发动其他网络攻…

51单片机-实机演示(单多个数码管)

仿真链接&#xff1a; http://t.csdnimg.cn/QAPhx 目录 一.引脚位置 二.多个显示 三 扩展 一.引脚位置 注意P00 - >A ; 这个多个的在左边,右边的A到B是控制最右边那个单个的. 接下来上显示单个的代码 #include <reg52.h> #include <intrins.h> #define u…

vscode中使用conda虚拟环境

每一次配置环境&#xff0c;真的巨烦&#xff0c;网上的资料一堆还得一个个尝试&#xff0c;遂进行整理 1.准备安装好Anaconda 附带一篇测试教程&#xff0c;安装anaconda 2.准备安装vscode 安装地址&#xff1a;Visual Studio Code 3.创建Conda环境 搜索框搜索Anaconda…

单点登录(JWT实现)

单点登陆的英文名是&#xff1a;Single Sign On&#xff08;简称SSO&#xff09;&#xff0c;只需要登陆一次&#xff0c;就可以访问所有信任的应用系统。 在单体项目中&#xff0c;我们登陆之后可以把验证用户信息的值放入session中&#xff0c;单个tomcat中的session是可以共…

一、Nginx详解和安装

目录 一、简介 1、什么是Nginx 2、Nginx的优点 二、四大应用场景 1、HTTP服务器 2、反向代理 3、负载均衡 4、动静分离 三、Nginx 源码安装 1、安装相关依赖 2、启动nginx 3、安装成系统服务 一、简介 1、什么是Nginx Nginx是一款轻量级的Web服务器&#xff0c;反向…

基于51单片机的智能灯光控制系统

一.硬件方案 智能灯光控制系统由单片机最小系统、人体感应模块、关照强度模块、灯光控制模块、电源模块和灯泡组成。本文以STC89C52单片机为核心&#xff0c;通过利用光照度和红外人体感应相结合主动与被动的探测方法&#xff0c;现了室内无人或者关照充足时灯光自动光灯&…

操作系统4_存储器管理

操作系统4_存储器管理 文章目录 操作系统4_存储器管理1. 存储器的管理功能1.1 地址映射/地址重定位1.2 主存分配与回收1.3 存储保护1.4 主存扩充/虚拟内存2. 存储器的层次结构3. 程序的接入与链接3.1 程序的链接3.2 程序的装入4. 分区存储管理4.1 单一连续分配4.2 固定分区分配…

Mac软件打开时提示:已损坏,无法打开。你应该将它移到废纸娄。怎么解决?

Mac软件打开时提示&#xff1a;已损坏&#xff0c;无法打开。你应该将它移到废纸娄。怎么解决? 原文地址&#xff1a;https://blog.csdn.net/weixin_48311847/article/details/138325009

【Mongo】索引结构

结论 Mongo3.2版本开始&#xff0c;索引的结构默认是B树。 起因 面试的时候&#xff0c;面试官问为什么Mongo DB底层使用B树而不是B树&#xff1f; 面试完赶紧恶补&#xff0c;结果发现面试官好像给我埋了个坑。。。 MongoDB官方描述&#xff1a; 翻译一下就是&#xff1…

多线程JUC 第2季 BlockingQueue 阻塞队列

一 阻塞队列 1.1 阻塞队列介绍 阻塞队列&#xff08;BlockingQueue&#xff09;是一个在队列基础上又支持了两个附加操作的队列&#xff1a; put方法&#xff1a;当队列装满时&#xff0c;添加的线程则被阻塞&#xff0c;直到队列不满&#xff0c;则可用。 take方法&#x…

数据库查询——kettle开发20

一、数据库查询 数据库查询就是数据库里面的左连接&#xff0c;左连接就是两张表执行左关联查询&#xff0c;把左边的表数据全部查询出来。 如图所示我们在进行数据库查询操作时&#xff0c;我们首先需建立数据库连接&#xff0c;输入表名和查询需要的关键字&#xff0c;最后…