news 2026/5/26 7:53:50

Spring Boot spring.factories文件详细说明

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot spring.factories文件详细说明

优质博文:IT-BLOG-CN

前言:经常看到 spring.factories 文件,却没有对它进行深入的了解和分析,今天我们就一起揭开面纱看看它的内在。

spring.factories 文件是 Spring Boot 自动配置机制的核心部分之一。它位于每个 Spring Boot 自动配置模块的 META-INF 目录下,用于声明该模块提供的自动配置类、条件性配置类、环境后处理器等。以下是对 spring.factories 文件的详细说明:

相信大家的项目中都会写starter,我们团队写的国际化通用和通用聚合服务等即插即用的功能包,就是用的starter。那么就会自己声明spring.factories文件。

这是一种工厂加载机制(factory loading mechanism),也可说成是SPI机制。原理分析在Spring SPI与Java SPI、Dubbo SPI

Spring Boot jar包下的spring.factories文件也声明了一些组件,为方便我的阐述,我把它列在了附录中。我会按照 介绍作用、初始化时机 去做分析。

一、基本结构

spring.factories 文件是一个键值对的属性文件,键和值之间用等号(=)分隔,多个值之间用逗号(,)分隔。文件内容通常如下所示:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=

com.example.MyAutoConfiguration,
com.example.AnotherAutoConfiguration

org.springframework.boot.autoconfigure.condition.ConditionalOnClass=

com.example.SomeClass

org.springframework.context.ApplicationListener=

com.example.MyApplicationListener

二、常见的键

EnableAutoConfiguration

EnableAutoConfiguration 是最常见的键,用于声明自动配置类。Spring Boot 会在启动时扫描这些类,并根据条件加载相应的配置。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=

com.example.MyAutoConfiguration,
com.example.AnotherAutoConfiguration

AutoConfigurationImportListener

AutoConfigurationImportListener 用于声明 AutoConfigurationImportListener 接口的实现类,这些类可以在自动配置类导入之前或之后执行一些逻辑。

org.springframework.boot.autoconfigure.AutoConfigurationImportListener=

com.example.MyAutoConfigurationImportListener

AutoConfigurationImportFilter

AutoConfigurationImportFilter 用于声明 AutoConfigurationImportFilter 接口的实现类,这些类可以在自动配置类导入之前过滤掉一些不需要的配置类。

org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=

com.example.MyAutoConfigurationImportFilter

org.springframework.boot.env.PropertySourceLoader

策略接口,用于加载PropertySource(配置)。实现有PropertiesPropertySourceLoader、YamlPropertySourceLoader。

初始化时机:当ConfigFileApplicationListener收到ApplicationEnvironmentPreparedEvent事件时, 创建SourceLoader并执行load,加载配置。

org.springframework.boot.SpringApplicationRunListener

用于监听spring boot启动并作出相应处理。

Listener for the SpringApplication run method。

初始化时机:在SpringApplication启动时进行初始化。

org.springframework.boot.SpringBootExceptionReporter

回调接口,用于对Spring Boot应用启动失败(发生异常)后,进行异常播报的组件。

初始化时机:在SpringApplication启动时(创建完Application context后)进行初始化。

org.springframework.context.ApplicationContextInitializer

用于在刷新之前初始化Spring ConfigurableApplicationContext的回调接口。比如,servlet web容器会用该组件设置一些额外的属性。

初始化时机:Spring Application构造时创建。

org.springframework.context.ApplicationListener

用于监听事件并作处理。

初始化时机:Spring Application构造时创建。

org.springframework.boot.env.EnvironmentPostProcessor

在context刷新前可对environment进行修改的组件。

初始化时机:在run listener发出ApplicationEnvironmentPreparedEvent事件后触发。

org.springframework.boot.diagnostics.FailureAnalyzer

分析错误,展示给用户诊断结果。

初始化时机:在SpringApplication启动时(创建完Application context后)进行初始化。 伴随一个SpringBootExceptionReporter(即org.springframework.boot.diagnostics.FailureAnalyzers) 的实例化而实例化。

org.springframework.boot.diagnostics.FailureAnalysisReporter

在错误分析完成后,向用户展示结果。(Spring Boot默认实现是通过日志展示出来)

初始化时机:在SpringApplication启动时(创建完Application context后)发生错误的情况下进行初始化。

spring boot包的spring.factories文件
# PropertySource Loaders org.springframework.boot.env.PropertySourceLoader=

org.springframework.boot.env.PropertiesPropertySourceLoader,
org.springframework.boot.env.YamlPropertySourceLoader

# Run Listeners org.springframework.boot.SpringApplicationRunListener=

org.springframework.boot.context.event.EventPublishingRunListener

# Error Reporters org.springframework.boot.SpringBootExceptionReporter=

org.springframework.boot.diagnostics.FailureAnalyzers

# Application Context Initializers org.springframework.context.ApplicationContextInitializer=

org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer,
org.springframework.boot.context.ContextIdApplicationContextInitializer,
org.springframework.boot.context.config.DelegatingApplicationContextInitializer,
org.springframework.boot.web.context.ServerPortInfoApplicationContextInitializer

# Application Listeners org.springframework.context.ApplicationListener=

org.springframework.boot.ClearCachesApplicationListener,
org.springframework.boot.builder.ParentContextCloserApplicationListener,
org.springframework.boot.context.FileEncodingApplicationListener,
org.springframework.boot.context.config.AnsiOutputApplicationListener,
org.springframework.boot.context.config.ConfigFileApplicationListener,
org.springframework.boot.context.config.DelegatingApplicationListener,
org.springframework.boot.context.logging.ClasspathLoggingApplicationListener,
org.springframework.boot.context.logging.LoggingApplicationListener,
org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener

# Environment Post Processors org.springframework.boot.env.EnvironmentPostProcessor=

org.springframework.boot.cloud.CloudFoundryVcapEnvironmentPostProcessor,
org.springframework.boot.env.SpringApplicationJsonEnvironmentPostProcessor,
org.springframework.boot.env.SystemEnvironmentPropertySourceEnvironmentPostProcessor

# Failure Analyzers org.springframework.boot.diagnostics.FailureAnalyzer=

org.springframework.boot.diagnostics.analyzer.BeanCurrentlyInCreationFailureAnalyzer,
org.springframework.boot.diagnostics.analyzer.BeanDefinitionOverrideFailureAnalyzer,
org.springframework.boot.diagnostics.analyzer.BeanNotOfRequiredTypeFailureAnalyzer,
org.springframework.boot.diagnostics.analyzer.BindFailureAnalyzer,
org.springframework.boot.diagnostics.analyzer.BindValidationFailureAnalyzer,
org.springframework.boot.diagnostics.analyzer.UnboundConfigurationPropertyFailureAnalyzer,
org.springframework.boot.diagnostics.analyzer.ConnectorStartFailureAnalyzer,
org.springframework.boot.diagnostics.analyzer.NoSuchMethodFailureAnalyzer,
org.springframework.boot.diagnostics.analyzer.NoUniqueBeanDefinitionFailureAnalyzer,
org.springframework.boot.diagnostics.analyzer.PortInUseFailureAnalyzer,
org.springframework.boot.diagnostics.analyzer.ValidationExceptionFailureAnalyzer,
org.springframework.boot.diagnostics.analyzer.InvalidConfigurationPropertyNameFailureAnalyzer,
org.springframework.boot.diagnostics.analyzer.InvalidConfigurationPropertyValueFailureAnalyzer

# FailureAnalysisReporters org.springframework.boot.diagnostics.FailureAnalysisReporter=

org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter

三、自动配置类

以下是一个简单的自动配置类示例:

package com.example.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyAutoConfiguration { @Bean public MyService myService() { return new MyService(); } }

条件性自动配置

package com.example.config; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @ConditionalOnClass(name = "com.example.SomeClass") public class MyAutoConfiguration { @Bean public MyService myService() { return new MyService(); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/22 10:50:53

HY-MT1.5-7B应用案例:多语言视频字幕生成系统

HY-MT1.5-7B应用案例:多语言视频字幕生成系统 1. 引言:从翻译模型到智能字幕系统的演进 随着全球化内容消费的快速增长,多语言视频字幕的需求日益旺盛。无论是国际会议、在线教育,还是影视娱乐,用户都期望能够跨越语言…

作者头像 李华
网站建设 2026/5/2 19:03:51

STM32CubeMX中文汉化支持下的工业网关构建:全面讲解

借力STM32CubeMX中文汉化,轻松打造工业级智能网关你有没有经历过这样的场景?手头一个工业项目急着出原型,现场设备五花八门:有走Modbus RTU的温湿度传感器、CANopen协议的电机驱动器,还要对接云平台做远程监控。传统开…

作者头像 李华
网站建设 2026/5/22 22:56:39

Keil中调试Cortex-M硬错误(Hard Fault)核心要点

如何在Keil中精准定位Cortex-M的Hard Fault?一位老工程师的实战手记最近带团队调试一个基于STM32H7的音频处理板卡,又一次碰上了那个让无数嵌入式开发者头皮发麻的问题——系统突然死机,复位后又能跑几秒,循环往复。连接Keil一查&…

作者头像 李华
网站建设 2026/5/22 2:55:27

从零实现CubeMX中FreeRTOS与SD卡驱动联动

如何用 CubeMX 让 FreeRTOS 和 SD 卡“和平共处”?在做嵌入式项目时,你有没有遇到过这种情况:系统要实时采集传感器数据,同时还得把日志写进 SD 卡。结果一调f_write(),整个程序卡住几十毫秒——LED 不闪了&#xff0c…

作者头像 李华
网站建设 2026/5/21 4:24:09

HY-MT1.5-7B优化教程:批处理效率提升方案

HY-MT1.5-7B优化教程:批处理效率提升方案 1. 引言 随着多语言内容在全球范围内的快速传播,高质量、高效率的机器翻译模型成为智能应用的核心组件。腾讯开源的混元翻译大模型 HY-MT1.5 系列,凭借其在多语言互译、混合语言理解与格式化输出方面…

作者头像 李华
网站建设 2026/5/1 5:49:50

HY-MT1.5-1.8B应用:移动端实时翻译APP开发

HY-MT1.5-1.8B应用:移动端实时翻译APP开发 1. 引言:轻量级大模型驱动的移动翻译新范式 随着全球化交流日益频繁,实时、准确的跨语言沟通已成为用户刚需。然而,传统云端翻译服务在隐私保护、网络延迟和离线可用性方面存在明显短板…

作者头像 李华