Springboot3 自动装配之核心文件:imports文件

ops/2025/1/23 10:26:07/

注:本文以spring-boot v3.4.1源码为基础,梳理spring-boot应用启动流程、分析自动装配的原理

如果对spring-boot2自动装配有兴趣,可以看看我另一篇文章:
Springboot2 自动装配之spring-autoconfigure-metadata.properties和spring.factories(SPI机制核心)

启动入口

以下是源码里一段应用启动单元测试代码:

package org.springframework.boot.test.autoconfigure;import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.boot.test.system.OutputCaptureExtension;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Configuration;import static org.assertj.core.api.Assertions.assertThat;/*** Tests for {@link ConditionReportApplicationContextFailureProcessor}.** @author Phillip Webb* @author Scott Frederick* @deprecated since 3.2.11 for removal in 3.6.0*/
@ExtendWith(OutputCaptureExtension.class)
@Deprecated(since = "3.2.11", forRemoval = true)
@SuppressWarnings("removal")
class ConditionReportApplicationContextFailureProcessorTests {@Testvoid loadFailureShouldPrintReport(CapturedOutput output) {SpringApplication application = new SpringApplication(TestConfig.class);application.setWebApplicationType(WebApplicationType.NONE);ConfigurableApplicationContext applicationContext = application.run();ConditionReportApplicationContextFailureProcessor processor = new ConditionReportApplicationContextFailureProcessor();processor.processLoadFailure(applicationContext, new IllegalStateException());assertThat(output).contains("CONDITIONS EVALUATION REPORT").contains("Positive matches").contains("Negative matches");}@Configuration(proxyBeanMethods = false)@ImportAutoConfiguration(JacksonAutoConfiguration.class)static class TestConfig {}
}

spring-boot3应用启动入口是SpringApplication的构造方法,这个构造方法里做了一些初始化,比较重要。如下:

	public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {this.resourceLoader = resourceLoader;Assert.notNull(primarySources, "PrimarySources must not be null");// @Athis.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));// @Bthis.properties.setWebApplicationType(WebApplicationType.deduceFromClasspath());// @Cthis.bootstrapRegistryInitializers = new ArrayList<>(getSpringFactoriesInstances(BootstrapRegistryInitializer.class));setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));this.mainApplicationClass = deduceMainApplicationClass();}

@A:标签当前应用的启动主类,也就是我们平常写的xxxApplication类
@B:在类路径下查找是否有 :

  • private static final String WEBMVC_INDICATOR_CLASS = “org.springframework.web.servlet.DispatcherServlet”;
  • private static final String WEBFLUX_INDICATOR_CLASS = “org.springframework.web.reactive.DispatcherHandler”;
  • private static final String JERSEY_INDICATOR_CLASS = “org.glassfish.jersey.servlet.ServletContainer”;
    中的一个,标记当前web应用类型;web应用类型有:REACTIVE SERVLET NONE

@C:从类路径中可见的 spring.factories 文件中获取配置的BootstrapRegistryInitializer.class、ApplicationContextInitializer.class、ApplicationListener.class并缓存

todo~~


http://www.ppmy.cn/ops/152444.html

相关文章

【Unity3D实现雨下在窗户上的效果】

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、效果展示👉二、原理👉三、使用步骤3-1、shader代码纹理映射数学运算和函数的运用特效算法的实现高效的性能优化👉壁纸分享👉总结👉前言 想要好看的效果肯定是要用shader实现啦,为什么呢? 因为Shade…

Y3编辑器2.0功能指引

文章目录 一、2.0功能概览1.1 地形1.1.1 植被染色1.1.2 3D物理组件和逻辑物理组件染色1.1.3 悬崖创建时自动刷纹理 1.2 成就系统1.3 新ECA1.4 界面拦截和可拖动1.5 音频上限及优先级 二、界面编辑器&#xff1a;元件&#xff08;待补&#xff09;三、AIGC3.1 语音生成3.2 图片生…

PHP语言的软件工程

PHP语言的软件工程 引言 软件工程是计算机科学中的一个重要分支&#xff0c;它涉及软件的规划、开发、测试和维护。在现代开发中&#xff0c;PHP作为一种流行的服务器端脚本语言&#xff0c;广泛应用于网页开发和各种企业应用中。本文将深入探讨PHP语言在软件工程中的应用&am…

Redis面试题每日20道【其二】

一、Redis 的订阅发布功能是什么&#xff1f;你了解吗&#xff1f; 中等 是的&#xff0c;我了解 Redis 的订阅发布&#xff08;Pub/Sub&#xff09;功能。它是一种消息通信模式&#xff0c;允许发送者&#xff08;生产者&#xff09;将消息发送到特定的频道&#xff08;chann…

Redis for AI

Redis存储和索引语义上表示非结构化数据&#xff08;包括文本通道、图像、视频或音频&#xff09;的向量嵌入。将向量和关联的元数据存储在哈希或JSON文档中&#xff0c;用于索引和查询。 Redis包括一个高性能向量数据库&#xff0c;允许您对向量嵌入执行语义搜索。可以通过过…

《人工智能安全治理框架》的解读与思考

文章目录 前言一、《框架》的发布背景二、《框架》的重要意义三、《框架》的核心内容1、人工智能安全治理原则。2、人工智能安全风险分类。3、技术应对与综合治理措施。4、人工智能安全开发应用指引。四、以标准工作推动《框架》有效落地1、加快构建并持续完善人工智能安全标准…

【前端知识】简单易懂的vue前端页面元素权限控制

文章目录 设计思路代码实现1. **权限数据管理**2. **权限判断方法**3. **动态控制元素**4. **路由权限控制**5. **无权限页面** 总结相关文献 在前端实现基于 Vue 的权限控制&#xff0c;通常需要结合后端返回的用户权限数据&#xff0c;动态控制页面元素的显示与隐藏、按钮的可…

FPGA 开发工作需求明确:关键要点与实践方法

FPGA开发工作需求明确&#xff1a;关键要点与实践方法 一、需求明确的重要性 在FPGA开发领域&#xff0c;明确的需求是项目成功的基石。FPGA开发往往涉及复杂的硬件逻辑设计、高速信号处理以及与其他系统的协同工作。若需求不明确&#xff0c;可能导致开发过程中频繁变更设计…