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();
    }
}
相关推荐
过期动态20 小时前
Java开发中的@EnableWebMvc注解和WebMvcConfigurer接口
java·开发语言·spring boot·spring·tomcat·maven·idea
野犬寒鸦21 小时前
从零起步学习并发编程 || 第一章:初步认识进程与线程
java·服务器·后端·学习
我爱娃哈哈21 小时前
SpringBoot + Flowable + 自定义节点:可视化工作流引擎,支持请假、报销、审批全场景
java·spring boot·后端
韩师学子--小倪1 天前
SpringBoot 优雅停服
spring boot·tomcat
李梨同学丶1 天前
0201好虫子周刊
后端
思想在飞肢体在追1 天前
Springboot项目配置Nacos
java·spring boot·后端·nacos
JavaGuide1 天前
推荐一个基于 Spring Boot 4.0 + Java 21 + Spring AI 2.0 的大模型项目!
java·spring boot·spring
Loo国昌1 天前
【垂类模型数据工程】第四阶段:高性能 Embedding 实战:从双编码器架构到 InfoNCE 损失函数详解
人工智能·后端·深度学习·自然语言处理·架构·transformer·embedding
NE_STOP1 天前
spring6-多种类型的注入方式
spring
小马爱打代码1 天前
Spring Boot :使用 Spring Cache 注解方式集成 Redis
spring boot·redis·spring