前言
为什么要有这篇文章?
当我们分析在spring boot源码时,经常会看到SpringFactoriesLoader.loadFactoryNames(xxx.classs)返回了很多自动化配置类的名称,比如EnableAutoConfiguration=xxxx, 虽然可以看到EnableAutoConfiguration具体加载的配置有哪些,但是它的值到底是从哪个项目来的,自动化配置了哪个项目可能还是很模糊,找对应的配置可能还需要花费一定的时间。
自动化配置的地方
BootstrapConfiguration
spring-cloud-context-2.2.0.RELEASE.jar!\META-INF\spring.factories
共4个properties1
2
3
4
5
6
7
# Bootstrap components
\ =
org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration,\
org.springframework.cloud.bootstrap.encrypt.EncryptionBootstrapConfiguration,\
org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration
spring-cloud-netflix-eureka-client-2.2.0.RELEASE.jar!\META-INF\spring.factories
共1个properties1
2\ =
org.springframework.cloud.netflix.eureka.config.EurekaDiscoveryClientConfigServiceBootstrapConfiguration
ApplicationListener
spring-boot-2.2.1.RELEASE.jar!\META-INF\spring.factories
共9个
1 | ## Application Listeners |
spring-cloud-context-2.2.0.RELEASE.jar!\META-INF\spring.factories
共3个
1 | ## Application Listeners |
spring-boot-autoconfigure-2.2.1.RELEASE.jar!\META-INF\spring.factories
共1个
1 | # Application Listeners |
ApplicationListener自动化配置加载原理
我们在编写一个spring boot应用时通常启动的方式是通过SpringApplication.run(xxx.class, args)
来启动的,
1 | public class SpringApplication { |
ApplicationContextInitializer
spring-boot-2.2.1.RELEASE.jar!\META-INF\spring.factories
Code1
2
3
4
5
6
7# 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.rsocket.context.RSocketPortInfoApplicationContextInitializer,\
org.springframework.boot.web.context.ServerPortInfoApplicationContextInitializerspring-boot-autoconfigure-2.2.1.RELEASE.jar!\META-INF\spring.factories
共2个Code1
2
3
4# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
加载ApplicationContextInitializer的源码见上一节ApplicationListener自动化配置加载原理
EnableAutoConfiguration
spring-boot-autoconfigure-2.2.1.RELEASE.jar!\META-INF\spring.factories
共2个
1 | # Auto Configure |
spring-cloud-commons-2.2.0.RELEASE.jar!\META-INF\spring.factories
Code1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# AutoConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.client.CommonsClientAutoConfiguration,\
org.springframework.cloud.client.ReactiveCommonsClientAutoConfiguration,\
org.springframework.cloud.client.discovery.composite.CompositeDiscoveryClientAutoConfiguration,\
org.springframework.cloud.client.discovery.composite.reactive.ReactiveCompositeDiscoveryClientAutoConfiguration,\
org.springframework.cloud.client.discovery.noop.NoopDiscoveryClientAutoConfiguration,\
org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration,\
org.springframework.cloud.client.discovery.simple.reactive.SimpleReactiveDiscoveryClientAutoConfiguration,\
org.springframework.cloud.client.hypermedia.CloudHypermediaAutoConfiguration,\
org.springframework.cloud.client.loadbalancer.AsyncLoadBalancerAutoConfiguration,\
org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration,\
org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration,\
org.springframework.cloud.client.loadbalancer.reactive.ReactorLoadBalancerClientAutoConfiguration,\
org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancerAutoConfiguration,\
org.springframework.cloud.client.serviceregistry.ServiceRegistryAutoConfiguration,\
org.springframework.cloud.commons.httpclient.HttpClientConfiguration,\
org.springframework.cloud.commons.util.UtilAutoConfiguration,\
org.springframework.cloud.configuration.CompatibilityVerifierAutoConfiguration,\
org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfigurationspring-cloud-context-2.2.0.RELEASE.jar!\META-INF\spring.factories
Code1
2
3
4
5
6
7# AutoConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration,\
org.springframework.cloud.autoconfigure.LifecycleMvcEndpointAutoConfiguration,\
org.springframework.cloud.autoconfigure.RefreshAutoConfiguration,\
org.springframework.cloud.autoconfigure.RefreshEndpointAutoConfiguration,\
org.springframework.cloud.autoconfigure.WritableEnvironmentEndpointAutoConfigurationspring-cloud-loadbalancer-2.2.0.RELEASE.jar!\META-INF\spring.factories
Code1
2
3
4
5# AutoConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.loadbalancer.config.LoadBalancerAutoConfiguration,\
org.springframework.cloud.loadbalancer.config.BlockingLoadBalancerClientAutoConfiguration,\
org.springframework.cloud.loadbalancer.config.LoadBalancerCacheAutoConfiguration
spring-cloud-openfeign-core-2.2.0.RELEASE.jar!\META-INF\spring.factories
1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ |
spring-cloud-netflix-ribbon-2.2.0.RELEASE.jar!\META-INF\spring.factories
Code1
2org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.netflix.ribbon.RibbonAutoConfigurationspring-cloud-netflix-hystrix-2.2.0.RELEASE.jar!\META-INF\spring.factories
Code1
2
3
4org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.netflix.hystrix.HystrixAutoConfiguration,\
org.springframework.cloud.netflix.hystrix.HystrixCircuitBreakerAutoConfiguration,\
org.springframework.cloud.netflix.hystrix.security.HystrixSecurityAutoConfiguration
EnableAutoConfiguration自动化配置加载原理
在@SpringBootApplication
注解上可以看到有@EnableAutoConfiguration
注解,
SpringBootApplication类的源码如下:
1 | (ElementType.TYPE) |
1 |
|
从上面可以看到它引入了AutoConfigurationImportSelector这个类,该类的具体实现见springboot2-2自动注入文件spring-factories如何加载详解
EnvironmentPostProcessor
spring-boot-2.2.1.RELEASE.jar!\META-INF\spring.factories
1 | # Environment Post Processors |
spring-cloud-commons-2.2.0.RELEASE.jar!\META-INF\spring.factories
Code1
2
3# Environment Post Processors
org.springframework.boot.env.EnvironmentPostProcessor=\
org.springframework.cloud.client.HostInfoEnvironmentPostProcessor
PropertySourceLoader
spring-boot-2.2.1.RELEASE.jar!\META-INF\spring.factories
Code1
2
3
4# PropertySource Loaders
org.springframework.boot.env.PropertySourceLoader=\
org.springframework.boot.env.PropertiesPropertySourceLoader,\
org.springframework.boot.env.YamlPropertySourceLoader
SpringApplicationRunListener
spring-boot-2.2.1.RELEASE.jar!\META-INF\spring.factories
Code1
2
3
4
# Run Listeners
org.springframework.boot.SpringApplicationRunListener=\
org.springframework.boot.context.event.EventPublishingRunListener
EnableCircuitBreaker
spring-cloud-netflix-hystrix-2.2.0.RELEASE.jar!\META-INF\spring.factories
1 | org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker=\ |
BeanInfoFactory
spring-beans-5.2.1.RELEASE.jar!\META-INF\spring.factories
Code1
org.springframework.beans.BeanInfoFactory=org.springframework.beans.ExtendedBeanInfoFactory
AutoConfigurationImportListener
spring-boot-autoconfigure-2.2.1.RELEASE.jar!\META-INF\spring.factories
Code1
2
3# Auto Configuration Import Listeners
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener
AutoConfigurationImportFilter
spring-boot-autoconfigure-2.2.1.RELEASE.jar!\META-INF\spring.factories
Code1
2
3
4
5# Auto Configuration Import Filters
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
org.springframework.boot.autoconfigure.condition.OnBeanCondition,\
org.springframework.boot.autoconfigure.condition.OnClassCondition,\
org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition
SpringBootExceptionReporter
spring-boot-2.2.1.RELEASE.jar!\META-INF\spring.factories
Code1
2
3# Error Reporters
org.springframework.boot.SpringBootExceptionReporter=\
org.springframework.boot.diagnostics.FailureAnalyzers
TemplateAvailabilityProvider
spring-boot-autoconfigure-2.2.1.RELEASE.jar!\META-INF\spring.factories
Code1
2
3
4
5
6
7# Template availability providers
org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.web.servlet.JspTemplateAvailabilityProvider
FailureAnalysisReporter
spring-boot-2.2.1.RELEASE.jar!\META-INF\spring.factories
Code1
2
3# FailureAnalysisReporters
org.springframework.boot.diagnostics.FailureAnalysisReporter=\
org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter