SpringBoot源码分析:SpringBoot自动装配(二)

一、概述

SpringBoot的启动流程入下图所示,它主要分为加载主启动类和解析启动类两个部分,我将从这两个部分分别开始介绍。

 

二、加载主启动类

首先点入SpringApplication.run方法

 之后进入SpringApplication.prepareContext方法

 之后进入SpringApplication.applyInitializers方法

再返回SpringApplication.prepareContext方法进入load(context, sources.toArray(new Object[0]));方法。

 之后进入BeanDefinitionLoader.load方法。

 再进入AnnotatedBeanDefinitionReader.register方法并经过AnnotatedBeanDefinitionReader.doRegisterBean最后进入BeanDefinitionReaderUtils.registerBeanDefinition方法,将解析的BeanDefinition注册进入容器。

 

三、解析启动类

通过AbstractApplicationContext.refresh方法进入AbstractApplicationContext.invokeBeanFactoryPostProcessors方法

 之后进入PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors方法。

之后进入SharedMetadataReaderFactoryContextInitializer.postProcessBeanDefinitionRegistry方法,这里将自动装配的类放到了容器当中。

 再回到PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors方法,最后转到

ConfigurationClassPostProcessor.postProcessBeanFactory方法。

之后进入 ConfigurationClassPostProcessor.processConfigBeanDefinitions方法。

 之后进入ConfigurationClassParser.parse方法

 进入ConfigurationClassParser.processConfigurationClass方法。

 之后进入ConfigurationClassParser.doProcessConfigurationClass方法。

先处理 @ComponentScans注解。

再通过ConfigurationClassParser.getImports方法,最后进入ConfigurationClassParser.collectImports进行@Import注解处理。

之后通过sourceClass.getAnnotationAttributes(Import.class.getName(), "value")这段代码获取注解上的信息。

回到ConfigurationClassParser.parse方法,改方法最后一行调用了DeferredImportSelectorHandler.process方法

往下走会调用DeferredImportSelectorHandler.processGroupImports方法。

之后进入 DeferredImportSelectorGrouping.getImports方法。

 再通过DeferredImportSelectorGrouping.getImports方法进入AutoConfigurationGroup.process方法,这个方法是自动装配的重点方法。

getAutoConfigurationEntry 方法详细解释一下


/*** Return the {@link AutoConfigurationEntry} based on the {@link AnnotationMetadata}* of the importing {@link Configuration @Configuration} class.* @param annotationMetadata the annotation metadata of the configuration class* @return the auto-configurations that should be imported*/
protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return EMPTY_ENTRY;}AnnotationAttributes attributes = getAttributes(annotationMetadata);// 通过 SpringFactoriesLoader 类提供的方法加载类路径中的 META-INF 目录下的 // spring.factories 文件中针对 EnableAutoConfiguration 的注册配置类List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);// 对获得的注册配置类集合进行去重处理,防止多个项目引入同样的配置类configurations = removeDuplicates(configurations);// 获得注解中被 exclude 或 excludeName 所排除的类的集合Set<String> exclusions = getExclusions(annotationMetadata, attributes);// 检查被排除类是否可实例化,是否被自动注册配置所使用,不符合条件则抛出异常checkExcludedClasses(configurations, exclusions);// 从自动配置类集合中去除被排除的类configurations.removeAll(exclusions);// 检查配置类的注解是否符合 spring.factories 文件中 AutoConfigurationImportFilter 指定的注解检查条件configurations = getConfigurationClassFilter().filter(configurations);// 将筛选完成的配置类和排查的配置类构建为事件类,并传入监听器。监听器的配置在于 spring.factories 文件中// 通过 AutoConfigurationImportListener 指定fireAutoConfigurationImportEvents(configurations, exclusions);return new AutoConfigurationEntry(configurations, exclusions);
}

能够发现getCandidateConfigurations 方法中会通过 SpringFactoriesLoader 类来加载类路径中的 META-INF 目录下的 spring.factories 文件中针对 EnableAutoConfiguration 的注册配置类。

下面是Spring Boot 自动装配源码 Debug 主线,感兴趣可以自行跟一下源码。

 

参考文章:

SpringBoot自动装配源码分析_spring自动装配源码解读_莫得感情的面包的博客-CSDN博客

https://www.cnblogs.com/Acaak/p/16932981.html

springboot之自动装配源码分析_springboot自动装配源码_平头 Brother的博客-CSDN博客 

玩转 Spring Boot 原理篇(自动装配源码剖析) 

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

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

相关文章

应用百花齐放,呈现北浙苏沪粤五极格局丨2021年中国区块链产业发展报告产业应用篇...

目前&#xff0c;区块链作为数字经济革命中的重要支撑&#xff0c;正以新一代信息基础设施的姿态快速发展并渗透到我国经济的各个领域&#xff0c;对我国经济社会发展的支撑作用初步显现。但同时&#xff0c;我国区块链也面临核心技术亟待突破、融合应用尚不成熟、产业生态有待…

大集中系统的个人所得税解决方案

大集中系统的个人所得税解决方案 1.1 前言 随着税收体制改革的发展&#xff0c;个人所得税在整个税收体系中占有的比重越来越大&#xff0c;自然人个人所得税明细申报也逐渐普及。个人所得税明细申报的主体涉及广大自然人纳税人&#xff0c;给税务机关的管理和税款…

【个人所得税的相关故事to me】

一、故事背景 虽然个人所得税汇算清缴&#xff08;以下简称为“个税年度汇算”&#xff09;自3月1号就开始了&#xff0c;个税申请退税&#xff08;ps:年收入 < 60k&#xff09;也自3月1号也开始了&#xff0c;但是我是到了今天才了解了相关的信息p(#&#xffe3;▽&#x…

powershell自动出IT考试题

以前给人培训时出的备考练习题&#xff0c;随机抽取题库题目&#xff0c;含分类练习和综合练习&#xff0c;自动出题&#xff0c;和给出答案&#xff0c;方便&#xff0c;快捷&#xff0c;小巧&#xff0c;大家可以试试 题源可以自己去更换 echo off setlocal enabledelayede…

【小demo】——直播平台自动发言

1. 背景 直播平台火热的现在&#xff0c;好多人已经开始直播致富了&#xff0c;但是很多直播新人因为人气等相关原因&#xff0c;就很难在直播平台爆火&#xff0c;有的人想到了买号&#xff0c;刷人气之类的&#xff0c;现在这款小demo就是配套的组件。 2. 前期准备 jar包 …

【MCS-51单片机汇编语言】期末复习总结⑥——串口通信(题型六)

文章目录 知识准备发送/接收缓冲器 SBUF串口通信控制寄存器SCON电源控制寄存器 PCON各个工作方式波特率的设定 常考题型例题1题目描述题目解析题解 例题2题目描述题解 知识准备 发送/接收缓冲器 SBUF 单片机在发送或接收数据的前先将数据存储在SBUF中&#xff1b;接收&#x…

程控电源CANoe上位机面板(CAN\ETH测试、RS232串口通信、编写设计思路)

程控电源CANoe上位机面板 编写此面板的目的编写思路一、通讯方式1、RS232串口连接2、CANoe与RS232串口相关的函数3、帧格式命令字4、校验码 二、面板设计1、所需文件说明2、导入使用3、功能模块化3.1 初始化3.2 端口设置3.3 控制方式3.4 脉冲程序3.5 电压电流状态3.6 运行设置的…

Android Studio Gradle实践之多渠道自动化打包+版本号管理

转&#xff1a; Android Studio Gradle实践之多渠道自动化打包版本号管理 上次介绍了Android Studio的安装、配置和基本使用。这次讲一下Android Studio用到的打包工具Gradle。Gradle是一种构建项目的框架&#xff0c;兼容Maven、Ant&#xff0c;为Java项目提供了很多插件去实现…

【测试实践】搞定云网络系统性能测试

一、前言 在部署或管理网络系统时&#xff0c;我们更多的是关心网络的连通性&#xff0c;而对于其整体的性能往往考虑不多&#xff0c;或者即使考虑到性能、异常或稳定性的问题&#xff0c;但却发现没有合适的手段去测试或监控网络健康状况。在本文中&#xff0c;首先简单介绍…

树莓派做一个获取GPS时间的NTP服务器

由于单位用的是内部网络&#xff0c;机器时间无法与internet同步&#xff0c;导致内网的所有设备各自为政&#xff0c;对工作和管理带来的麻烦说不清&#xff0c;为解决这个问题&#xff0c;决定用手里的树莓派做通过GPS获取时间&#xff0c;然后提供NTP服务。在某宝逛了一圈&a…

自动(智能)驾驶 | 全网第一本激光雷达手册阅读指南(下)

接着从上篇继续说&#xff0c;本部分主要介绍激光雷达数据等内容&#xff0c;这个可以说是看懂激光雷达手册的重中之重&#xff0c;也就是关键问题的关键&#xff08;皮~&#xff09;。同样由于velodyne的手册比较难啃但是内容完整丰富&#xff0c;本期我们依然以velodyne 128&…

GEO-SPARK 2000X PPS使用记录(三)

最近单位突然要使用GeoSpark电火花&#xff0c;至少有4年没有用过了。我一直没有独立操作过&#xff0c;只是看同事操作过&#xff0c;碰巧的是会使用这个设备的同事去大洋了&#xff0c;悲剧的是他们把所有的采集狗都拿走了&#xff0c;留下一个巨大的坑让我来填。 1、首先看看…

CMOS图像传感器——工作原理

一、像素阵列结构 一般像素阵列是由水平方向的行( Row ) 和垂直方向的列(Column)正交排列构成的。像素排列的最基本设计原则是:摄像器件像素排列的坐标,必须在显示的时候能够准确地还原在图像原来的相对位置上。在大多数情况下,每个像素中心线在行的方向和列的方向,即…

Kerberos从入门到精通以及案例实操系列(二)

5、安全集群使用说明 5.1、用户要求 具体要求以下使用说明均基于普通用户&#xff0c;安全集群对用户有以下要求&#xff1a; 集群中的每个节点都需要创建该用户该用户需要属于hadoop用户组需要创建该用户对应的Kerberos主体 实操&#xff0c;此处以atguigu用户为例&#x…

3.了解Spring Boot2自动配置原理

了解Spring Boot2自动配置原理 1、SpringBoot特点 1.1、依赖管理 1.父项目做依赖管理 依赖管理 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEAS…

Docker搭建Elasticsearch方法及启动后服务自动关闭的问题

太长不看&#xff0c;一句话总结 内存太小&#xff0c;启动命令中添加参数修改虚拟机大小即可 docker run -e ES_JAVA_OPTS"-Xms256m -Xmx256m" -e "discovery.typesingle-node" -d -p 9200:9200 -p 9300:9300 --name elasticsearch elasticsearch:7.6.0配…

NTP自动退出问题排查

为什么80%的码农都做不了架构师?>>> 问题现象:ntp进程运行一段时间后自动退出 排查过程: 查看/var/log/message ntp异常信息如下 Feb 20 22:54:41 xnu_1 ntpd[2187]: 0.0.0.0 0617 07 panic_stop -28777 s; set clock manually within 1000 s. Feb 20 22:54:57 …

Docker部署Elasticsearch及安装后自动关闭的问题

Docker搭建Elasticsearch方法 前往dockerhub官网&#xff1a;dockerhub 可查看elasticsearch相应版本 拉取镜像 选取一个版本拉取镜像&#xff0c;如docker pull elasticsearch:7.9.2 不输入版本默认拉取最新版 启动容器 映射端口为9200和9300 docker pull elasticsearch:…

自动化基础笔记--元素操作

元素操作&#xff08;附带鼠标悬停&#xff09; 一些课程回顾&#xff0c;问题原因总结 函数只有在return的时候&#xff0c;才会返回一个数据。返回数据了才可以赋值的 报错&#xff1a; 等待时间不够返回的元素不是你想要的确实是你表达式写错了有句柄未切换或者有iframe未…

服务器设置了自动校时但是,同步时钟配置电脑自动校时

同步时钟配置电脑自动校时 一、同步时钟操作和指示灯说明。 同步时钟可接收全球定位系统GPS、北斗卫星信号。当GPS/北斗天线架设到屋顶时&#xff0c;天线的高度必须低于房屋顶避雷天线的高度&#xff0c;防止被雷击。 先关闭电源后再连接或者去掉天线。 电源指示灯&#xff1a…