關(guān)于SpringBoot的spring.factories文件詳細(xì)說(shuō)明

前言
經(jīng)常看到 spring.factories 文件,卻沒(méi)有對(duì)它進(jìn)行深入的了解和分析,今天我們就一起揭開(kāi)面紗看看它的內(nèi)在。
spring.factories 文件是 Spring Boot 自動(dòng)配置機(jī)制的核心部分之一。它位于每個(gè) Spring Boot 自動(dòng)配置模塊的 META-INF 目錄下,用于聲明該模塊提供的自動(dòng)配置類(lèi)、條件性配置類(lèi)、環(huán)境后處理器等。以下是對(duì) spring.factories 文件的詳細(xì)說(shuō)明:
相信大家的項(xiàng)目中都會(huì)寫(xiě)starter,我們團(tuán)隊(duì)寫(xiě)的國(guó)際化通用和通用聚合服務(wù)等即插即用的功能包,就是用的starter。那么就會(huì)自己聲明spring.factories文件。
這是一種工廠加載機(jī)制(factory loading mechanism),也可說(shuō)成是SPI機(jī)制。原理分析在Spring SPI與Java SPI、Dubbo SPI
Spring Boot jar包下的spring.factories文件也聲明了一些組件,為方便我的闡述,我把它列在了附錄中。我會(huì)按照 介紹作用、初始化時(shí)機(jī) 去做分析。
一、基本結(jié)構(gòu)
spring.factories 文件是一個(gè)鍵值對(duì)的屬性文件,鍵和值之間用等號(hào)(=)分隔,多個(gè)值之間用逗號(hào)(,)分隔。文件內(nèi)容通常如下所示:
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
二、常見(jiàn)的鍵
EnableAutoConfiguration
EnableAutoConfiguration 是最常見(jiàn)的鍵,用于聲明自動(dòng)配置類(lèi)。Spring Boot 會(huì)在啟動(dòng)時(shí)掃描這些類(lèi),并根據(jù)條件加載相應(yīng)的配置。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.MyAutoConfiguration,\ com.example.AnotherAutoConfiguration
AutoConfigurationImportListener
AutoConfigurationImportListener 用于聲明 AutoConfigurationImportListener 接口的實(shí)現(xiàn)類(lèi),這些類(lèi)可以在自動(dòng)配置類(lèi)導(dǎo)入之前或之后執(zhí)行一些邏輯。
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\ com.example.MyAutoConfigurationImportListener
AutoConfigurationImportFilter
AutoConfigurationImportFilter 用于聲明 AutoConfigurationImportFilter 接口的實(shí)現(xiàn)類(lèi),這些類(lèi)可以在自動(dòng)配置類(lèi)導(dǎo)入之前過(guò)濾掉一些不需要的配置類(lèi)。
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\ com.example.MyAutoConfigurationImportFilter
org.springframework.boot.env.PropertySourceLoader
策略接口,用于加載PropertySource(配置)。實(shí)現(xiàn)有PropertiesPropertySourceLoader、YamlPropertySourceLoader。
初始化時(shí)機(jī): 當(dāng)ConfigFileApplicationListener收到ApplicationEnvironmentPreparedEvent事件時(shí), 創(chuàng)建SourceLoader并執(zhí)行l(wèi)oad,加載配置。
org.springframework.boot.SpringApplicationRunListener
用于監(jiān)聽(tīng)spring boot啟動(dòng)并作出相應(yīng)處理。
Listener for the SpringApplication run method。
初始化時(shí)機(jī): 在SpringApplication啟動(dòng)時(shí)進(jìn)行初始化。
org.springframework.boot.SpringBootExceptionReporter
回調(diào)接口,用于對(duì)Spring Boot應(yīng)用啟動(dòng)失?。òl(fā)生異常)后,進(jìn)行異常播報(bào)的組件。
初始化時(shí)機(jī): 在SpringApplication啟動(dòng)時(shí)(創(chuàng)建完Application context后)進(jìn)行初始化。
org.springframework.context.ApplicationContextInitializer
用于在刷新之前初始化Spring ConfigurableApplicationContext的回調(diào)接口。比如,servlet web容器會(huì)用該組件設(shè)置一些額外的屬性。
初始化時(shí)機(jī): Spring Application構(gòu)造時(shí)創(chuàng)建。
org.springframework.context.ApplicationListener
用于監(jiān)聽(tīng)事件并作處理。
初始化時(shí)機(jī): Spring Application構(gòu)造時(shí)創(chuàng)建。
org.springframework.boot.env.EnvironmentPostProcessor
在context刷新前可對(duì)environment進(jìn)行修改的組件。
初始化時(shí)機(jī): 在run listener發(fā)出ApplicationEnvironmentPreparedEvent事件后觸發(fā)。
org.springframework.boot.diagnostics.FailureAnalyzer
分析錯(cuò)誤,展示給用戶(hù)診斷結(jié)果。
初始化時(shí)機(jī): 在SpringApplication啟動(dòng)時(shí)(創(chuàng)建完Application context后)進(jìn)行初始化。 伴隨一個(gè)SpringBootExceptionReporter(即org.springframework.boot.diagnostics.FailureAnalyzers) 的實(shí)例化而實(shí)例化。
org.springframework.boot.diagnostics.FailureAnalysisReporter
在錯(cuò)誤分析完成后,向用戶(hù)展示結(jié)果。(Spring Boot默認(rèn)實(shí)現(xiàn)是通過(guò)日志展示出來(lái))
初始化時(shí)機(jī): 在SpringApplication啟動(dòng)時(shí)(創(chuàng)建完Application context后)發(fā)生錯(cuò)誤的情況下進(jìn)行初始化。
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
三、自動(dòng)配置類(lèi)
以下是一個(gè)簡(jiǎn)單的自動(dòng)配置類(lèi)示例:
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();
}
}
條件性自動(dòng)配置
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();
}
}
以上就是關(guān)于SpringBoot的spring.factories文件詳細(xì)說(shuō)明的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot spring.factories文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決Maven?build打包,類(lèi)找不到,找不到引用的那個(gè)項(xiàng)目里面的類(lèi)問(wèn)題
文章討論了在使用Maven構(gòu)建項(xiàng)目時(shí)遇到類(lèi)找不到的問(wèn)題,并給出了解決方法,主要原因是公共項(xiàng)目被打成了可執(zhí)行的jar,導(dǎo)致其他項(xiàng)目無(wú)法引用其中的類(lèi),解決方法包括在公共項(xiàng)目的pom中將打包類(lèi)型改為普通jar,以及在主項(xiàng)目中正確引用公共項(xiàng)目2026-02-02
SpringBoot中整合JodConverter實(shí)現(xiàn)文件在線預(yù)覽功能
Spring Boot JodConverter是一個(gè)基于Spring Boot框架的文檔轉(zhuǎn)換工具,它使用JodConverter庫(kù)來(lái)實(shí)現(xiàn)文檔格式之間的轉(zhuǎn)換,本文主要介紹了SpringBoot中整合JodConverter實(shí)現(xiàn)文件在線預(yù)覽功能,需要的朋友可以參考下2024-04-04
Spring中@Value設(shè)置默認(rèn)值問(wèn)題解決
本文主要介紹了Spring中@Value設(shè)置默認(rèn)值問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
IntelliJ IDEA 使用經(jīng)驗(yàn)總結(jié)(推薦)
這篇文章主要介紹了IntelliJ IDEA 使用經(jīng)驗(yàn)總結(jié),非常不錯(cuò),具有參考價(jià)值,需要的朋友可以參考下2018-02-02
Java并發(fā)編程示例(七):守護(hù)線程的創(chuàng)建和運(yùn)行
這篇文章主要介紹了Java并發(fā)編程示例(七):守護(hù)線程的創(chuàng)建和運(yùn)行,在本節(jié)示例中,我們將創(chuàng)建兩個(gè)線程,一個(gè)是普通線程,向隊(duì)列中寫(xiě)入事件,另外一個(gè)是守護(hù)線程,清除隊(duì)列中的事件,需要的朋友可以參考下2014-12-12
如何基于SpringBoot部署外部Tomcat過(guò)程解析
這篇文章主要介紹了SpringBoot以war包形式部署到外部Tomcat過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12

