Spring 源码解析十四(SpringBoot Autoconfigure 初始化应用时加载的组件)

Spring 源码解析十四:SpringBoot Autoconfigure 初始化应用时加载的组件 这些组件定义在 spring.factories

# 初始化器 org.springframework.context.ApplicationContextInitializer=\ org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\ org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener# 应用事件监听器 org.springframework.context.ApplicationListener=\ org.springframework.boot.autoconfigure.BackgroundPreinitializer# 自动配置导入监听器 org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\ org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener# 自动配置导入过滤器 org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\ org.springframework.boot.autoconfigure.condition.OnBeanCondition,\ org.springframework.boot.autoconfigure.condition.OnClassCondition,\ org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition# 自动配置 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\ org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\ org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\ org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\ org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\ org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\ org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\ org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\ org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRestClientAutoConfiguration,\ org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\ org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\ org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\ org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration,\ org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\ org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\ org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\ org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\ org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\ org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\ org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\ org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration,\ org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\ org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\ org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\ org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\ org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\ org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\ org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\ org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\ org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\ org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\ org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration,\ org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\ org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\ org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\ org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\ org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\ org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\ org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration,\ org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\ org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\ org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration,\ org.springframework.boot.autoconfigure.r2dbc.R2dbcTransactionManagerAutoConfiguration,\ org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration,\ org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration,\ org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration,\ org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration,\ org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\ org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\ org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\ org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration,\ org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\ org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\ org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration,\ org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration,\ org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration,\ org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration,\ org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\ org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,\ org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,\ org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\ org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\ org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\ org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\ org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\ org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration,\ org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration# 失败分析器 org.springframework.boot.diagnostics.FailureAnalyzer=\ org.springframework.boot.autoconfigure.data.redis.RedisUrlSyntaxFailureAnalyzer,\ org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\ org.springframework.boot.autoconfigure.flyway.FlywayMigrationScriptMissingFailureAnalyzer,\ org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\ org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer,\ org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryBeanCreationFailureAnalyzer,\ org.springframework.boot.autoconfigure.session.NonUniqueSessionRepositoryFailureAnalyzer# 检查模板可用提供器 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

1. 初始化器
org.springframework.context.ApplicationContextInitializer=\ org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\ org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener

1.1. SharedMetadataReaderFactoryContextInitializer
SharedMetadataReaderFactoryContextInitializer
的主要功能是提供一个共享的缓存元信息读取工厂
class SharedMetadataReaderFactoryContextInitializer implements ApplicationContextInitializer, Ordered { // 初始化 @Override public void initialize(ConfigurableApplicationContext applicationContext) { BeanFactoryPostProcessor postProcessor = new CachingMetadataReaderFactoryPostProcessor(applicationContext); applicationContext.addBeanFactoryPostProcessor(postProcessor); }static class CachingMetadataReaderFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered { // 注册bean定义 @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { // 注册bean定义注册器 register(registry); // 配置 @Configuration bean configureConfigurationClassPostProcessor(registry); }// 注册bean定义注册器 private void register(BeanDefinitionRegistry registry) { BeanDefinition definition = BeanDefinitionBuilder .genericBeanDefinition(SharedMetadataReaderFactoryBean.class, SharedMetadataReaderFactoryBean::new) .getBeanDefinition(); // 注册为 "org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory" 名字 registry.registerBeanDefinition(BEAN_NAME, definition); }// 配置 @Configuration bean private void configureConfigurationClassPostProcessor(BeanDefinitionRegistry registry) { try { // 配置bean "org.springframework.context.annotation.internalConfigurationAnnotationProcessor" configureConfigurationClassPostProcessor( registry.getBeanDefinition(AnnotationConfigUtils.CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)); } catch (NoSuchBeanDefinitionException ex) { } } } }

1.2. ConditionEvaluationReportLoggingListener
ConditionEvaluationReportLoggingListener
的主要功能是输出日志到文件
2. 应用事件监听器
org.springframework.context.ApplicationListener=\ org.springframework.boot.autoconfigure.BackgroundPreinitializer

BackgroundPreinitializer
的主要功能是初始化数据转换与编码等服务
public class BackgroundPreinitializer implements ApplicationListener { @Override public void onApplicationEvent(SpringApplicationEvent event) { // ... 代码省略if (event instanceof ApplicationEnvironmentPreparedEvent && preinitializationStarted.compareAndSet(false, true)) { performPreinitialization(); } if ((event instanceof ApplicationReadyEvent || event instanceof ApplicationFailedEvent) && preinitializationStarted.get()) { try { preinitializationComplete.await(); } catch (InterruptedException ex) { Thread.currentThread().interrupt(); } } }// 初始化其他组件 private void performPreinitialization() { try { Thread thread = new Thread(new Runnable() {@Override public void run() { // 初始化数据转换服务,DefaultFormattingConversionService runSafely(new ConversionServiceInitializer()); // 初始化数据验证服务,Validation.byDefaultProvider() runSafely(new ValidationInitializer()); // 初始化消息转换服务,AllEncompassingFormHttpMessageConverter runSafely(new MessageConverterInitializer()); // 初始化JSON服务,Jackson2ObjectMapperBuilder runSafely(new JacksonInitializer()); // 初始化字符编码服务,StandardCharsets runSafely(new CharsetInitializer()); preinitializationComplete.countDown(); }public void runSafely(Runnable runnable) { try { runnable.run(); } catch (Throwable ex) {} }}, "background-preinit"); thread.start(); } catch (Exception ex) { // ... 代码省略 } }private static class MessageConverterInitializer implements Runnable { @Override public void run() { new AllEncompassingFormHttpMessageConverter(); } }private static class ValidationInitializer implements Runnable { @Override public void run() { Configuration configuration = Validation.byDefaultProvider().configure(); configuration.buildValidatorFactory().getValidator(); } }private static class JacksonInitializer implements Runnable { @Override public void run() { Jackson2ObjectMapperBuilder.json().build(); } }private static class ConversionServiceInitializer implements Runnable { @Override public void run() { new DefaultFormattingConversionService(); } }private static class CharsetInitializer implements Runnable { @Override public void run() { StandardCharsets.UTF_8.name(); } } }

3. 自动配置导入监听器
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\ org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener

ConditionEvaluationReportAutoConfigurationImportListener
的主要功能是从 Report 中读取结果
4. 自动配置导入过滤器
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\ org.springframework.boot.autoconfigure.condition.OnBeanCondition,\ org.springframework.boot.autoconfigure.condition.OnClassCondition,\ org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition

4.1. OnBeanCondition
OnBeanCondition
的主要功能是处理注解 @ConditionalOnBean@ConditionalOnMissingBean@ConditionalOnSingleCandidate,按条件动态载入 bean
  • @ConditionOnBean 判断条件 bean 存在,注入当下注解的 bean
  • @ConditionOnMissingBean 判断条件 bean 不存在,才注入当下注解的 bean
  • @ConditionalOnSingleCandidate 判断条件 bean 只能有一个实例或多个但只有一个 primary 实例,才注入当下注解的 bean
先来看看继承关系
- SpringBootCondition - FilteringSpringBootCondition - OnBeanCondition

4.1.1. SpringBootCondition SpringBootCondition
是用条件来检查组件的基础类
public abstract class SpringBootCondition implements Condition { // 元信息代表的组件是否匹配 @Override public final boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { // 获取类名或方法名 String classOrMethodName = getClassOrMethodName(metadata); try { // 获取匹配结果 ConditionOutcome outcome = getMatchOutcome(context, metadata); // ... 代码省略// 返回是否匹配 return outcome.isMatch(); } catch (NoClassDefFoundError ex) { // ... 代码省略 }// ... 代码省略 }// 获取匹配结果,由子类实现 public abstract ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata); }

4.1.2. FilteringSpringBootCondition FilteringSpringBootCondition
的主要功能是添加过滤功能
abstract class FilteringSpringBootCondition extends SpringBootCondition implements AutoConfigurationImportFilter, BeanFactoryAware, BeanClassLoaderAware { // 元信息代表的组件是否匹配 @Override public boolean[] match(String[] autoConfigurationClasses, AutoConfigurationMetadata autoConfigurationMetadata) { // 获取结果 ConditionOutcome[] outcomes = getOutcomes(autoConfigurationClasses, autoConfigurationMetadata); boolean[] match = new boolean[outcomes.length]; for (int i = 0; i < outcomes.length; i++) { // 如果返回为null或true,则表示匹配 match[i] = (outcomes[i] == null || outcomes[i].isMatch()); // ... 代码省略 } return match; }// 获取结果,由子类实现 protected abstract ConditionOutcome[] getOutcomes(String[] autoConfigurationClasses, AutoConfigurationMetadata autoConfigurationMetadata); }

4.1.3. SpringBootCondition SpringBootCondition
的主要功能是处理注解 @ConditionalOnBean@ConditionalOnMissingBean@ConditionalOnSingleCandidate,按条件动态载入 bean
class OnBeanCondition extends FilteringSpringBootCondition implements ConfigurationCondition { // 获取结果 @Override protected final ConditionOutcome[] getOutcomes(String[] autoConfigurationClasses, AutoConfigurationMetadata autoConfigurationMetadata) { // 结果集 ConditionOutcome[] outcomes = new ConditionOutcome[autoConfigurationClasses.length]; for (int i = 0; i < outcomes.length; i++) { // 自动配置类 String autoConfigurationClass = autoConfigurationClasses[i]; if (autoConfigurationClass != null) { // 获取ConditionalOnBean的bean类型 Set onBeanTypes = autoConfigurationMetadata.getSet(autoConfigurationClass, "ConditionalOnBean"); // 确定有没有ConditionalOnBean的bean类型 outcomes[i] = getOutcome(onBeanTypes, ConditionalOnBean.class); if (outcomes[i] == null) { // 获取ConditionalOnSingleCandidate的bean类型 Set onSingleCandidateTypes = autoConfigurationMetadata.getSet(autoConfigurationClass, "ConditionalOnSingleCandidate"); // 确定有没有ConditionalOnSingleCandidate的bean类型 outcomes[i] = getOutcome(onSingleCandidateTypes, ConditionalOnSingleCandidate.class); } } } return outcomes; } }

class OnBeanCondition extends FilteringSpringBootCondition implements ConfigurationCondition { // 获取匹配结果 @Override public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { // 匹配信息 ConditionMessage matchMessage = ConditionMessage.empty(); // 元信息中的注解 MergedAnnotations annotations = metadata.getAnnotations(); // 有@ConditionalOnBean注解 if (annotations.isPresent(ConditionalOnBean.class)) { // 创建ConditionalOnBean的匹配标准对象 Spec spec = new Spec<>(context, metadata, annotations, ConditionalOnBean.class); // 获取匹配的bean MatchResult matchResult = getMatchingBeans(context, spec); // 如果一个都没有匹配到 if (!matchResult.isAllMatched()) { // 返回匹配不到的信息 String reason = createOnBeanNoMatchReason(matchResult); return ConditionOutcome.noMatch(spec.message().because(reason)); } // 匹配到了,继续 matchMessage = spec.message(matchMessage).found("bean", "beans").items(Style.QUOTE, matchResult.getNamesOfAllMatches()); } // 有@ConditionalOnSingleCandidate注解 if (metadata.isAnnotated(ConditionalOnSingleCandidate.class.getName())) { // 创建ConditionalOnSingleCandidate的匹配标准对象 Spec spec = new SingleCandidateSpec(context, metadata, annotations); // 获取匹配的bean MatchResult matchResult = getMatchingBeans(context, spec); // 如果一个都没有匹配到 if (!matchResult.isAllMatched()) { // 返回匹配不到的信息 return ConditionOutcome.noMatch(spec.message().didNotFind("any beans").atAll()); } // 匹配到多个bean,但没有primary bean else if (!hasSingleAutowireCandidate(context.getBeanFactory(), matchResult.getNamesOfAllMatches(), spec.getStrategy() == SearchStrategy.ALL)) { // 返回匹配到多个的信息 return ConditionOutcome.noMatch(spec.message().didNotFind("a primary bean from beans") .items(Style.QUOTE, matchResult.getNamesOfAllMatches())); } // 匹配到了,继续 matchMessage = spec.message(matchMessage).found("a primary bean from beans").items(Style.QUOTE, matchResult.getNamesOfAllMatches()); } // 有@ConditionalOnMissingBean注解 if (metadata.isAnnotated(ConditionalOnMissingBean.class.getName())) { // 创建ConditionalOnMissingBean的匹配标准对象 Spec spec = new Spec<>(context, metadata, annotations, ConditionalOnMissingBean.class); // 获取匹配的bean MatchResult matchResult = getMatchingBeans(context, spec); // 如果匹配到了 if (matchResult.isAnyMatched()) { // 返回匹配到了的信息 String reason = createOnMissingBeanNoMatchReason(matchResult); return ConditionOutcome.noMatch(spec.message().because(reason)); } // 匹配不到,继续 matchMessage = spec.message(matchMessage).didNotFind("any beans").atAll(); } return ConditionOutcome.match(matchMessage); } }

4.2. OnClassCondition
OnClassCondition
的主要功能是处理注解 @ConditionalOnClass@ConditionalOnMissingClass,按条件动态载入 bean
  • @ConditionalOnClass 判断条件类存在,注入当下注解的 bean
  • @ConditionalOnMissingClass 判断条件类不存在,才注入当下注解的 bean
class OnClassCondition extends FilteringSpringBootCondition { // 获取结果 @Override protected final ConditionOutcome[] getOutcomes(String[] autoConfigurationClasses, AutoConfigurationMetadata autoConfigurationMetadata) { // ... 代码省略OutcomesResolver outcomesResolver = new StandardOutcomesResolver(autoConfigurationClasses, 0, autoConfigurationClasses.length, autoConfigurationMetadata, getBeanClassLoader()); // 获取ConditionalOnClass的输出 return outcomesResolver.resolveOutcomes(); }// 获取匹配结果 @Override public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { ClassLoader classLoader = context.getClassLoader(); // 匹配信息 ConditionMessage matchMessage = ConditionMessage.empty(); // 获取标记有@ConditionalOnClass注解的类 List onClasses = getCandidates(metadata, ConditionalOnClass.class); if (onClasses != null) { List missing = filter(onClasses, ClassNameFilter.MISSING, classLoader); // 类不存在,返回 if (!missing.isEmpty()) { return ConditionOutcome.noMatch(ConditionMessage.forCondition(ConditionalOnClass.class) .didNotFind("required class", "required classes").items(Style.QUOTE, missing)); } // 类存在,继续 matchMessage = matchMessage.andCondition(ConditionalOnClass.class) .found("required class", "required classes") .items(Style.QUOTE, filter(onClasses, ClassNameFilter.PRESENT, classLoader)); } // 获取标记有@ConditionalOnMissingClass注解的类 List onMissingClasses = getCandidates(metadata, ConditionalOnMissingClass.class); if (onMissingClasses != null) { List present = filter(onMissingClasses, ClassNameFilter.PRESENT, classLoader); // 类存在,返回 if (!present.isEmpty()) { return ConditionOutcome.noMatch(ConditionMessage.forCondition(ConditionalOnMissingClass.class) .found("unwanted class", "unwanted classes").items(Style.QUOTE, present)); } // 类不存在,继续 matchMessage = matchMessage.andCondition(ConditionalOnMissingClass.class) .didNotFind("unwanted class", "unwanted classes") .items(Style.QUOTE, filter(onMissingClasses, ClassNameFilter.MISSING, classLoader)); } return ConditionOutcome.match(matchMessage); }}

4.3. OnWebApplicationCondition
OnWebApplicationCondition
的主要功能是处理注解 @ConditionalOnWebApplication@ConditionalOnNotWebApplication,按条件动态载入 bean
  • @ConditionalOnWebApplication 判断应用时 Web 应用时,注入当下注解的 bean
  • @ConditionalOnNotWebApplication 判断应用时不是 Web 应用时,才注入当下注解的 bean
5. 自动配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\ org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\ org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\ org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\ org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\ org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\ org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\ org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\ org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRestClientAutoConfiguration,\ org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\ org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\ org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\ org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration,\ org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\ org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\ org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\ org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\ org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\ org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\ org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\ org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration,\ org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\ org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\ org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\ org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\ org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\ org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\ org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\ org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\ org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\ org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\ org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration,\ org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\ org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\ org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\ org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\ org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\ org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\ org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration,\ org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\ org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\ org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration,\ org.springframework.boot.autoconfigure.r2dbc.R2dbcTransactionManagerAutoConfiguration,\ org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration,\ org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration,\ org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration,\ org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration,\ org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\ org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\ org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\ org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration,\ org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\ org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\ org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration,\ org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration,\ org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration,\ org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration,\ org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\ org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,\ org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,\ org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\ org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\ org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\ org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\ org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\ org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration,\ org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration

  • SpringApplicationAdminJmxAutoConfiguration
  • AopAutoConfiguration
  • RabbitAutoConfiguration
  • BatchAutoConfiguration
  • CacheAutoConfiguration
  • CassandraAutoConfiguration
  • ConfigurationPropertiesAutoConfiguration
  • LifecycleAutoConfiguration
  • MessageSourceAutoConfiguration
  • PropertyPlaceholderAutoConfiguration
  • CouchbaseAutoConfiguration
  • PersistenceExceptionTranslationAutoConfiguration
  • CassandraDataAutoConfiguration
  • CassandraReactiveDataAutoConfiguration
  • CassandraReactiveRepositoriesAutoConfiguration
  • CassandraRepositoriesAutoConfiguration
  • CouchbaseDataAutoConfiguration
  • CouchbaseReactiveDataAutoConfiguration
  • CouchbaseReactiveRepositoriesAutoConfiguration
  • CouchbaseRepositoriesAutoConfiguration
  • ElasticsearchDataAutoConfiguration
  • ElasticsearchRepositoriesAutoConfiguration
  • ReactiveElasticsearchRepositoriesAutoConfiguration
  • ReactiveElasticsearchRestClientAutoConfiguration
  • JdbcRepositoriesAutoConfiguration
  • JpaRepositoriesAutoConfiguration
  • LdapRepositoriesAutoConfiguration
  • MongoDataAutoConfiguration
  • MongoReactiveDataAutoConfiguration
  • MongoReactiveRepositoriesAutoConfiguration
  • MongoRepositoriesAutoConfiguration
  • Neo4jDataAutoConfiguration
  • Neo4jReactiveDataAutoConfiguration
  • Neo4jReactiveRepositoriesAutoConfiguration
  • Neo4jRepositoriesAutoConfiguration
  • R2dbcDataAutoConfiguration
  • R2dbcRepositoriesAutoConfiguration
  • RedisAutoConfiguration
  • RedisReactiveAutoConfiguration
  • RedisRepositoriesAutoConfiguration
  • RepositoryRestMvcAutoConfiguration
  • SpringDataWebAutoConfiguration
  • ElasticsearchRestClientAutoConfiguration
  • FlywayAutoConfiguration
  • FreeMarkerAutoConfiguration
  • GroovyTemplateAutoConfiguration
  • GsonAutoConfiguration
  • H2ConsoleAutoConfiguration
  • HypermediaAutoConfiguration
  • HazelcastAutoConfiguration
  • HazelcastJpaDependencyAutoConfiguration
  • HttpMessageConvertersAutoConfiguration
  • CodecsAutoConfiguration
  • InfluxDbAutoConfiguration
  • ProjectInfoAutoConfiguration
  • IntegrationAutoConfiguration
  • JacksonAutoConfiguration
  • DataSourceAutoConfiguration
  • JdbcTemplateAutoConfiguration
  • JndiDataSourceAutoConfiguration
  • XADataSourceAutoConfiguration
  • DataSourceTransactionManagerAutoConfiguration
  • JmsAutoConfiguration
  • JmxAutoConfiguration
  • JndiConnectionFactoryAutoConfiguration
  • ActiveMQAutoConfiguration
  • ArtemisAutoConfiguration
  • JerseyAutoConfiguration
  • JooqAutoConfiguration
  • JsonbAutoConfiguration
  • KafkaAutoConfiguration
  • ApplicationAvailabilityAutoConfiguration
  • EmbeddedLdapAutoConfiguration
  • LdapAutoConfiguration
  • LiquibaseAutoConfiguration
  • MailSenderAutoConfiguration
  • MailSenderValidatorAutoConfiguration
  • EmbeddedMongoAutoConfiguration
  • MongoAutoConfiguration
  • MongoReactiveAutoConfiguration
  • MustacheAutoConfiguration
  • Neo4jAutoConfiguration
  • HibernateJpaAutoConfiguration
  • QuartzAutoConfiguration
  • R2dbcAutoConfiguration
  • R2dbcTransactionManagerAutoConfiguration
  • RSocketMessagingAutoConfiguration
  • RSocketRequesterAutoConfiguration
  • RSocketServerAutoConfiguration
  • RSocketStrategiesAutoConfiguration
  • SecurityAutoConfiguration
  • UserDetailsServiceAutoConfiguration
  • SecurityFilterAutoConfiguration
  • ReactiveSecurityAutoConfiguration
  • ReactiveUserDetailsServiceAutoConfiguration
  • RSocketSecurityAutoConfiguration
  • Saml2RelyingPartyAutoConfiguration
  • SendGridAutoConfiguration
  • SessionAutoConfiguration
  • OAuth2ClientAutoConfiguration
  • ReactiveOAuth2ClientAutoConfiguration
  • OAuth2ResourceServerAutoConfiguration
  • ReactiveOAuth2ResourceServerAutoConfiguration
  • SolrAutoConfiguration
  • TaskExecutionAutoConfiguration
  • TaskSchedulingAutoConfiguration
  • ThymeleafAutoConfiguration
  • TransactionAutoConfiguration
  • JtaAutoConfiguration
  • ValidationAutoConfiguration
  • RestTemplateAutoConfiguration
  • EmbeddedWebServerFactoryCustomizerAutoConfiguration
  • HttpHandlerAutoConfiguration
  • ReactiveWebServerFactoryAutoConfiguration
  • WebFluxAutoConfiguration
  • ErrorWebFluxAutoConfiguration
  • ClientHttpConnectorAutoConfiguration
  • WebClientAutoConfiguration
  • DispatcherServletAutoConfiguration
  • ServletWebServerFactoryAutoConfiguration
  • ErrorMvcAutoConfiguration
  • HttpEncodingAutoConfiguration
  • MultipartAutoConfiguration
  • WebMvcAutoConfiguration
  • WebSocketReactiveAutoConfiguration
  • WebSocketServletAutoConfiguration
  • WebSocketMessagingAutoConfiguration
  • WebServicesAutoConfiguration
  • WebServiceTemplateAutoConfiguration
以上的类都是通过 application*.yaml 中的属性配置自动装载成 bean。这些类比较多,可以自行探索
6. 失败分析器
org.springframework.boot.diagnostics.FailureAnalyzer=\ org.springframework.boot.autoconfigure.data.redis.RedisUrlSyntaxFailureAnalyzer,\ org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\ org.springframework.boot.autoconfigure.flyway.FlywayMigrationScriptMissingFailureAnalyzer,\ org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\ org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer,\ org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryBeanCreationFailureAnalyzer,\ org.springframework.boot.autoconfigure.session.NonUniqueSessionRepositoryFailureAnalyzer

  • RedisUrlSyntaxFailureAnalyzer
    Redis url 语法错误
  • NoSuchBeanDefinitionFailureAnalyzer
    没有 bean 定义
  • FlywayMigrationScriptMissingFailureAnalyzer
    Flyway 没有可用的 sql 脚本
  • DataSourceBeanCreationFailureAnalyzer
    数据库源 bean 创建失败
  • HikariDriverConfigurationFailureAnalyzer
    HikariCP 配置失败
  • ConnectionFactoryBeanCreationFailureAnalyzer
    ConnectionFactory bean 创建失败
  • NonUniqueSessionRepositoryFailureAnalyzer
    多个 Spring Session 错误
这些类都比较简单,可以自行探索
7. 检查模板可用提供器
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

  • FreeMarkerTemplateAvailabilityProvider
    FreeMarker 模板检查
  • MustacheTemplateAvailabilityProvider
    Mustache 模板检查
  • GroovyTemplateAvailabilityProvider
    Groovy 模板检查
  • ThymeleafTemplateAvailabilityProvider
    Thymeleaf 模板检查
  • JspTemplateAvailabilityProvider
    Jsp 模板检查
这些类都比较简单,可以自行探索
后续 更多博客,查看 https://github.com/senntyou/blogs
作者:深予之 (@senntyou)
【Spring 源码解析十四(SpringBoot Autoconfigure 初始化应用时加载的组件)】版权声明:自由转载-非商用-非衍生-保持署名(创意共享 3.0 许可证)

    推荐阅读