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

x33g5p2x  于2022-02-11 发布在 Spring  
字(42.1k)|赞(0)|评价(0)|浏览(616)

这些组件定义在 spring.factories

  1. # 初始化器
  2. org.springframework.context.ApplicationContextInitializer=\
  3. org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
  4. org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
  5. # 应用事件监听器
  6. org.springframework.context.ApplicationListener=\
  7. org.springframework.boot.autoconfigure.BackgroundPreinitializer
  8. # 自动配置导入监听器
  9. org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
  10. org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener
  11. # 自动配置导入过滤器
  12. org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
  13. org.springframework.boot.autoconfigure.condition.OnBeanCondition,\
  14. org.springframework.boot.autoconfigure.condition.OnClassCondition,\
  15. org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition
  16. # 自动配置
  17. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  18. org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
  19. org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
  20. org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
  21. org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
  22. org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
  23. org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
  24. org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
  25. org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\
  26. org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
  27. org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
  28. org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
  29. org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
  30. org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
  31. org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,\
  32. org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\
  33. org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
  34. org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
  35. org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\
  36. org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\
  37. org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
  38. org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
  39. org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
  40. org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,\
  41. org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRestClientAutoConfiguration,\
  42. org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\
  43. org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
  44. org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
  45. org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
  46. org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\
  47. org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\
  48. org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
  49. org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
  50. org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveDataAutoConfiguration,\
  51. org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveRepositoriesAutoConfiguration,\
  52. org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
  53. org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration,\
  54. org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration,\
  55. org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
  56. org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\
  57. org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
  58. org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
  59. org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
  60. org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration,\
  61. org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
  62. org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
  63. org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
  64. org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
  65. org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\
  66. org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\
  67. org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\
  68. org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\
  69. org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration,\
  70. org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\
  71. org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\
  72. org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\
  73. org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
  74. org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
  75. org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
  76. org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
  77. org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
  78. org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
  79. org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
  80. org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\
  81. org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
  82. org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\
  83. org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\
  84. org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\
  85. org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
  86. org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
  87. org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\
  88. org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\
  89. org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration,\
  90. org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\
  91. org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\
  92. org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
  93. org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
  94. org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
  95. org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
  96. org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
  97. org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\
  98. org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
  99. org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration,\
  100. org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
  101. org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\
  102. org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration,\
  103. org.springframework.boot.autoconfigure.r2dbc.R2dbcTransactionManagerAutoConfiguration,\
  104. org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration,\
  105. org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration,\
  106. org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration,\
  107. org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration,\
  108. org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\
  109. org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\
  110. org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\
  111. org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\
  112. org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\
  113. org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration,\
  114. org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration,\
  115. org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
  116. org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
  117. org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration,\
  118. org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration,\
  119. org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration,\
  120. org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration,\
  121. org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
  122. org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,\
  123. org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,\
  124. org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
  125. org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
  126. org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
  127. org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\
  128. org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,\
  129. org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\
  130. org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\
  131. org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\
  132. org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\
  133. org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\
  134. org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,\
  135. org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\
  136. org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
  137. org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
  138. org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\
  139. org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\
  140. org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\
  141. org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
  142. org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\
  143. org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\
  144. org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\
  145. org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration,\
  146. org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration
  147. # 失败分析器
  148. org.springframework.boot.diagnostics.FailureAnalyzer=\
  149. org.springframework.boot.autoconfigure.data.redis.RedisUrlSyntaxFailureAnalyzer,\
  150. org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\
  151. org.springframework.boot.autoconfigure.flyway.FlywayMigrationScriptMissingFailureAnalyzer,\
  152. org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\
  153. org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer,\
  154. org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryBeanCreationFailureAnalyzer,\
  155. org.springframework.boot.autoconfigure.session.NonUniqueSessionRepositoryFailureAnalyzer
  156. # 检查模板可用提供器
  157. org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
  158. org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\
  159. org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider,\
  160. org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAvailabilityProvider,\
  161. org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityProvider,\
  162. org.springframework.boot.autoconfigure.web.servlet.JspTemplateAvailabilityProvider

1. 初始化器

  1. org.springframework.context.ApplicationContextInitializer=\
  2. org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
  3. org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener

1.1. SharedMetadataReaderFactoryContextInitializer

SharedMetadataReaderFactoryContextInitializer
的主要功能是提供一个共享的缓存元信息读取工厂

  1. class SharedMetadataReaderFactoryContextInitializer
  2. implements ApplicationContextInitializer<ConfigurableApplicationContext>, Ordered {
  3. // 初始化
  4. @Override
  5. public void initialize(ConfigurableApplicationContext applicationContext) {
  6. BeanFactoryPostProcessor postProcessor = new CachingMetadataReaderFactoryPostProcessor(applicationContext);
  7. applicationContext.addBeanFactoryPostProcessor(postProcessor);
  8. }
  9. static class CachingMetadataReaderFactoryPostProcessor
  10. implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {
  11. // 注册bean定义
  12. @Override
  13. public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
  14. // 注册bean定义注册器
  15. register(registry);
  16. // 配置 @Configuration bean
  17. configureConfigurationClassPostProcessor(registry);
  18. }
  19. // 注册bean定义注册器
  20. private void register(BeanDefinitionRegistry registry) {
  21. BeanDefinition definition = BeanDefinitionBuilder
  22. .genericBeanDefinition(SharedMetadataReaderFactoryBean.class, SharedMetadataReaderFactoryBean::new)
  23. .getBeanDefinition();
  24. // 注册为 "org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory" 名字
  25. registry.registerBeanDefinition(BEAN_NAME, definition);
  26. }
  27. // 配置 @Configuration bean
  28. private void configureConfigurationClassPostProcessor(BeanDefinitionRegistry registry) {
  29. try {
  30. // 配置bean "org.springframework.context.annotation.internalConfigurationAnnotationProcessor"
  31. configureConfigurationClassPostProcessor(
  32. registry.getBeanDefinition(AnnotationConfigUtils.CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
  33. }
  34. catch (NoSuchBeanDefinitionException ex) {
  35. }
  36. }
  37. }
  38. }

1.2. ConditionEvaluationReportLoggingListener

ConditionEvaluationReportLoggingListener
的主要功能是输出日志到文件

2. 应用事件监听器

  1. org.springframework.context.ApplicationListener=\
  2. org.springframework.boot.autoconfigure.BackgroundPreinitializer

BackgroundPreinitializer
的主要功能是初始化数据转换与编码等服务

  1. public class BackgroundPreinitializer implements ApplicationListener<SpringApplicationEvent> {
  2. @Override
  3. public void onApplicationEvent(SpringApplicationEvent event) {
  4. // ... 代码省略
  5. if (event instanceof ApplicationEnvironmentPreparedEvent
  6. && preinitializationStarted.compareAndSet(false, true)) {
  7. performPreinitialization();
  8. }
  9. if ((event instanceof ApplicationReadyEvent || event instanceof ApplicationFailedEvent)
  10. && preinitializationStarted.get()) {
  11. try {
  12. preinitializationComplete.await();
  13. }
  14. catch (InterruptedException ex) {
  15. Thread.currentThread().interrupt();
  16. }
  17. }
  18. }
  19. // 初始化其他组件
  20. private void performPreinitialization() {
  21. try {
  22. Thread thread = new Thread(new Runnable() {
  23. @Override
  24. public void run() {
  25. // 初始化数据转换服务,DefaultFormattingConversionService
  26. runSafely(new ConversionServiceInitializer());
  27. // 初始化数据验证服务,Validation.byDefaultProvider()
  28. runSafely(new ValidationInitializer());
  29. // 初始化消息转换服务,AllEncompassingFormHttpMessageConverter
  30. runSafely(new MessageConverterInitializer());
  31. // 初始化JSON服务,Jackson2ObjectMapperBuilder
  32. runSafely(new JacksonInitializer());
  33. // 初始化字符编码服务,StandardCharsets
  34. runSafely(new CharsetInitializer());
  35. preinitializationComplete.countDown();
  36. }
  37. public void runSafely(Runnable runnable) {
  38. try {
  39. runnable.run();
  40. }
  41. catch (Throwable ex) {}
  42. }
  43. }, "background-preinit");
  44. thread.start();
  45. }
  46. catch (Exception ex) {
  47. // ... 代码省略
  48. }
  49. }
  50. private static class MessageConverterInitializer implements Runnable {
  51. @Override
  52. public void run() {
  53. new AllEncompassingFormHttpMessageConverter();
  54. }
  55. }
  56. private static class ValidationInitializer implements Runnable {
  57. @Override
  58. public void run() {
  59. Configuration<?> configuration = Validation.byDefaultProvider().configure();
  60. configuration.buildValidatorFactory().getValidator();
  61. }
  62. }
  63. private static class JacksonInitializer implements Runnable {
  64. @Override
  65. public void run() {
  66. Jackson2ObjectMapperBuilder.json().build();
  67. }
  68. }
  69. private static class ConversionServiceInitializer implements Runnable {
  70. @Override
  71. public void run() {
  72. new DefaultFormattingConversionService();
  73. }
  74. }
  75. private static class CharsetInitializer implements Runnable {
  76. @Override
  77. public void run() {
  78. StandardCharsets.UTF_8.name();
  79. }
  80. }
  81. }

3. 自动配置导入监听器

  1. org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
  2. org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener

ConditionEvaluationReportAutoConfigurationImportListener
的主要功能是从 Report 中读取结果

4. 自动配置导入过滤器

  1. org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
  2. org.springframework.boot.autoconfigure.condition.OnBeanCondition,\
  3. org.springframework.boot.autoconfigure.condition.OnClassCondition,\
  4. org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition

4.1. OnBeanCondition

OnBeanCondition
的主要功能是处理注解 @ConditionalOnBean@ConditionalOnMissingBean@ConditionalOnSingleCandidate,按条件动态载入 bean

  • @ConditionOnBean 判断条件 bean 存在,注入当下注解的 bean
  • @ConditionOnMissingBean 判断条件 bean 不存在,才注入当下注解的 bean
  • @ConditionalOnSingleCandidate 判断条件 bean 只能有一个实例或多个但只有一个 primary 实例,才注入当下注解的 bean

先来看看继承关系

  1. - SpringBootCondition
  2. - FilteringSpringBootCondition
  3. - OnBeanCondition

4.1.1. SpringBootCondition

SpringBootCondition
是用条件来检查组件的基础类

  1. public abstract class SpringBootCondition implements Condition {
  2. // 元信息代表的组件是否匹配
  3. @Override
  4. public final boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
  5. // 获取类名或方法名
  6. String classOrMethodName = getClassOrMethodName(metadata);
  7. try {
  8. // 获取匹配结果
  9. ConditionOutcome outcome = getMatchOutcome(context, metadata);
  10. // ... 代码省略
  11. // 返回是否匹配
  12. return outcome.isMatch();
  13. }
  14. catch (NoClassDefFoundError ex) {
  15. // ... 代码省略
  16. }
  17. // ... 代码省略
  18. }
  19. // 获取匹配结果,由子类实现
  20. public abstract ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata);
  21. }

4.1.2. FilteringSpringBootCondition

FilteringSpringBootCondition
的主要功能是添加过滤功能

  1. abstract class FilteringSpringBootCondition extends SpringBootCondition
  2. implements AutoConfigurationImportFilter, BeanFactoryAware, BeanClassLoaderAware {
  3. // 元信息代表的组件是否匹配
  4. @Override
  5. public boolean[] match(String[] autoConfigurationClasses, AutoConfigurationMetadata autoConfigurationMetadata) {
  6. // 获取结果
  7. ConditionOutcome[] outcomes = getOutcomes(autoConfigurationClasses, autoConfigurationMetadata);
  8. boolean[] match = new boolean[outcomes.length];
  9. for (int i = 0; i < outcomes.length; i++) {
  10. // 如果返回为null或true,则表示匹配
  11. match[i] = (outcomes[i] == null || outcomes[i].isMatch());
  12. // ... 代码省略
  13. }
  14. return match;
  15. }
  16. // 获取结果,由子类实现
  17. protected abstract ConditionOutcome[] getOutcomes(String[] autoConfigurationClasses,
  18. AutoConfigurationMetadata autoConfigurationMetadata);
  19. }

4.1.3. SpringBootCondition

SpringBootCondition
的主要功能是处理注解 @ConditionalOnBean@ConditionalOnMissingBean@ConditionalOnSingleCandidate,按条件动态载入 bean

  1. class OnBeanCondition extends FilteringSpringBootCondition implements ConfigurationCondition {
  2. // 获取结果
  3. @Override
  4. protected final ConditionOutcome[] getOutcomes(String[] autoConfigurationClasses,
  5. AutoConfigurationMetadata autoConfigurationMetadata) {
  6. // 结果集
  7. ConditionOutcome[] outcomes = new ConditionOutcome[autoConfigurationClasses.length];
  8. for (int i = 0; i < outcomes.length; i++) {
  9. // 自动配置类
  10. String autoConfigurationClass = autoConfigurationClasses[i];
  11. if (autoConfigurationClass != null) {
  12. // 获取ConditionalOnBean的bean类型
  13. Set<String> onBeanTypes = autoConfigurationMetadata.getSet(autoConfigurationClass, "ConditionalOnBean");
  14. // 确定有没有ConditionalOnBean的bean类型
  15. outcomes[i] = getOutcome(onBeanTypes, ConditionalOnBean.class);
  16. if (outcomes[i] == null) {
  17. // 获取ConditionalOnSingleCandidate的bean类型
  18. Set<String> onSingleCandidateTypes = autoConfigurationMetadata.getSet(autoConfigurationClass,
  19. "ConditionalOnSingleCandidate");
  20. // 确定有没有ConditionalOnSingleCandidate的bean类型
  21. outcomes[i] = getOutcome(onSingleCandidateTypes, ConditionalOnSingleCandidate.class);
  22. }
  23. }
  24. }
  25. return outcomes;
  26. }
  27. }
  1. class OnBeanCondition extends FilteringSpringBootCondition implements ConfigurationCondition {
  2. // 获取匹配结果
  3. @Override
  4. public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
  5. // 匹配信息
  6. ConditionMessage matchMessage = ConditionMessage.empty();
  7. // 元信息中的注解
  8. MergedAnnotations annotations = metadata.getAnnotations();
  9. // 有@ConditionalOnBean注解
  10. if (annotations.isPresent(ConditionalOnBean.class)) {
  11. // 创建ConditionalOnBean的匹配标准对象
  12. Spec<ConditionalOnBean> spec = new Spec<>(context, metadata, annotations, ConditionalOnBean.class);
  13. // 获取匹配的bean
  14. MatchResult matchResult = getMatchingBeans(context, spec);
  15. // 如果一个都没有匹配到
  16. if (!matchResult.isAllMatched()) {
  17. // 返回匹配不到的信息
  18. String reason = createOnBeanNoMatchReason(matchResult);
  19. return ConditionOutcome.noMatch(spec.message().because(reason));
  20. }
  21. // 匹配到了,继续
  22. matchMessage = spec.message(matchMessage).found("bean", "beans").items(Style.QUOTE,
  23. matchResult.getNamesOfAllMatches());
  24. }
  25. // 有@ConditionalOnSingleCandidate注解
  26. if (metadata.isAnnotated(ConditionalOnSingleCandidate.class.getName())) {
  27. // 创建ConditionalOnSingleCandidate的匹配标准对象
  28. Spec<ConditionalOnSingleCandidate> spec = new SingleCandidateSpec(context, metadata, annotations);
  29. // 获取匹配的bean
  30. MatchResult matchResult = getMatchingBeans(context, spec);
  31. // 如果一个都没有匹配到
  32. if (!matchResult.isAllMatched()) {
  33. // 返回匹配不到的信息
  34. return ConditionOutcome.noMatch(spec.message().didNotFind("any beans").atAll());
  35. }
  36. // 匹配到多个bean,但没有primary bean
  37. else if (!hasSingleAutowireCandidate(context.getBeanFactory(), matchResult.getNamesOfAllMatches(),
  38. spec.getStrategy() == SearchStrategy.ALL)) {
  39. // 返回匹配到多个的信息
  40. return ConditionOutcome.noMatch(spec.message().didNotFind("a primary bean from beans")
  41. .items(Style.QUOTE, matchResult.getNamesOfAllMatches()));
  42. }
  43. // 匹配到了,继续
  44. matchMessage = spec.message(matchMessage).found("a primary bean from beans").items(Style.QUOTE,
  45. matchResult.getNamesOfAllMatches());
  46. }
  47. // 有@ConditionalOnMissingBean注解
  48. if (metadata.isAnnotated(ConditionalOnMissingBean.class.getName())) {
  49. // 创建ConditionalOnMissingBean的匹配标准对象
  50. Spec<ConditionalOnMissingBean> spec = new Spec<>(context, metadata, annotations,
  51. ConditionalOnMissingBean.class);
  52. // 获取匹配的bean
  53. MatchResult matchResult = getMatchingBeans(context, spec);
  54. // 如果匹配到了
  55. if (matchResult.isAnyMatched()) {
  56. // 返回匹配到了的信息
  57. String reason = createOnMissingBeanNoMatchReason(matchResult);
  58. return ConditionOutcome.noMatch(spec.message().because(reason));
  59. }
  60. // 匹配不到,继续
  61. matchMessage = spec.message(matchMessage).didNotFind("any beans").atAll();
  62. }
  63. return ConditionOutcome.match(matchMessage);
  64. }
  65. }

4.2. OnClassCondition

OnClassCondition
的主要功能是处理注解 @ConditionalOnClass@ConditionalOnMissingClass,按条件动态载入 bean

  • @ConditionalOnClass 判断条件类存在,注入当下注解的 bean
  • @ConditionalOnMissingClass 判断条件类不存在,才注入当下注解的 bean
  1. class OnClassCondition extends FilteringSpringBootCondition {
  2. // 获取结果
  3. @Override
  4. protected final ConditionOutcome[] getOutcomes(String[] autoConfigurationClasses,
  5. AutoConfigurationMetadata autoConfigurationMetadata) {
  6. // ... 代码省略
  7. OutcomesResolver outcomesResolver = new StandardOutcomesResolver(autoConfigurationClasses, 0,
  8. autoConfigurationClasses.length, autoConfigurationMetadata, getBeanClassLoader());
  9. // 获取ConditionalOnClass的输出
  10. return outcomesResolver.resolveOutcomes();
  11. }
  12. // 获取匹配结果
  13. @Override
  14. public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
  15. ClassLoader classLoader = context.getClassLoader();
  16. // 匹配信息
  17. ConditionMessage matchMessage = ConditionMessage.empty();
  18. // 获取标记有@ConditionalOnClass注解的类
  19. List<String> onClasses = getCandidates(metadata, ConditionalOnClass.class);
  20. if (onClasses != null) {
  21. List<String> missing = filter(onClasses, ClassNameFilter.MISSING, classLoader);
  22. // 类不存在,返回
  23. if (!missing.isEmpty()) {
  24. return ConditionOutcome.noMatch(ConditionMessage.forCondition(ConditionalOnClass.class)
  25. .didNotFind("required class", "required classes").items(Style.QUOTE, missing));
  26. }
  27. // 类存在,继续
  28. matchMessage = matchMessage.andCondition(ConditionalOnClass.class)
  29. .found("required class", "required classes")
  30. .items(Style.QUOTE, filter(onClasses, ClassNameFilter.PRESENT, classLoader));
  31. }
  32. // 获取标记有@ConditionalOnMissingClass注解的类
  33. List<String> onMissingClasses = getCandidates(metadata, ConditionalOnMissingClass.class);
  34. if (onMissingClasses != null) {
  35. List<String> present = filter(onMissingClasses, ClassNameFilter.PRESENT, classLoader);
  36. // 类存在,返回
  37. if (!present.isEmpty()) {
  38. return ConditionOutcome.noMatch(ConditionMessage.forCondition(ConditionalOnMissingClass.class)
  39. .found("unwanted class", "unwanted classes").items(Style.QUOTE, present));
  40. }
  41. // 类不存在,继续
  42. matchMessage = matchMessage.andCondition(ConditionalOnMissingClass.class)
  43. .didNotFind("unwanted class", "unwanted classes")
  44. .items(Style.QUOTE, filter(onMissingClasses, ClassNameFilter.MISSING, classLoader));
  45. }
  46. return ConditionOutcome.match(matchMessage);
  47. }
  48. }

4.3. OnWebApplicationCondition

OnWebApplicationCondition
的主要功能是处理注解 @ConditionalOnWebApplication@ConditionalOnNotWebApplication,按条件动态载入 bean

  • @ConditionalOnWebApplication 判断应用时 Web 应用时,注入当下注解的 bean
  • @ConditionalOnNotWebApplication 判断应用时不是 Web 应用时,才注入当下注解的 bean

5. 自动配置

  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  2. org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
  3. org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
  4. org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
  5. org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
  6. org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
  7. org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
  8. org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
  9. org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\
  10. org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
  11. org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
  12. org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
  13. org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
  14. org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
  15. org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,\
  16. org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\
  17. org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
  18. org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
  19. org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\
  20. org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\
  21. org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
  22. org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
  23. org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
  24. org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,\
  25. org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRestClientAutoConfiguration,\
  26. org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\
  27. org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
  28. org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
  29. org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
  30. org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\
  31. org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\
  32. org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
  33. org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
  34. org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveDataAutoConfiguration,\
  35. org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveRepositoriesAutoConfiguration,\
  36. org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
  37. org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration,\
  38. org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration,\
  39. org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
  40. org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\
  41. org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
  42. org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
  43. org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
  44. org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration,\
  45. org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
  46. org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
  47. org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
  48. org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
  49. org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\
  50. org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\
  51. org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\
  52. org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\
  53. org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration,\
  54. org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\
  55. org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\
  56. org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\
  57. org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
  58. org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
  59. org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
  60. org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
  61. org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
  62. org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
  63. org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
  64. org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\
  65. org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
  66. org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\
  67. org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\
  68. org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\
  69. org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
  70. org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
  71. org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\
  72. org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\
  73. org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration,\
  74. org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\
  75. org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\
  76. org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
  77. org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
  78. org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
  79. org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
  80. org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
  81. org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\
  82. org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
  83. org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration,\
  84. org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
  85. org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\
  86. org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration,\
  87. org.springframework.boot.autoconfigure.r2dbc.R2dbcTransactionManagerAutoConfiguration,\
  88. org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration,\
  89. org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration,\
  90. org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration,\
  91. org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration,\
  92. org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\
  93. org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\
  94. org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\
  95. org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\
  96. org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\
  97. org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration,\
  98. org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration,\
  99. org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
  100. org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
  101. org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration,\
  102. org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration,\
  103. org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration,\
  104. org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration,\
  105. org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
  106. org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,\
  107. org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,\
  108. org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
  109. org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
  110. org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
  111. org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\
  112. org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,\
  113. org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\
  114. org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\
  115. org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\
  116. org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\
  117. org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\
  118. org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,\
  119. org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\
  120. org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
  121. org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
  122. org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\
  123. org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\
  124. org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\
  125. org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
  126. org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\
  127. org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\
  128. org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\
  129. org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration,\
  130. org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration

以上的类都是通过 application*.yaml 中的属性配置自动装载成 bean。这些类比较多,可以自行探索

6. 失败分析器

  1. org.springframework.boot.diagnostics.FailureAnalyzer=\
  2. org.springframework.boot.autoconfigure.data.redis.RedisUrlSyntaxFailureAnalyzer,\
  3. org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\
  4. org.springframework.boot.autoconfigure.flyway.FlywayMigrationScriptMissingFailureAnalyzer,\
  5. org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\
  6. org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer,\
  7. org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryBeanCreationFailureAnalyzer,\
  8. org.springframework.boot.autoconfigure.session.NonUniqueSessionRepositoryFailureAnalyzer

这些类都比较简单,可以自行探索

7. 检查模板可用提供器

  1. org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
  2. org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\
  3. org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider,\
  4. org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAvailabilityProvider,\
  5. org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityProvider,\
  6. org.springframework.boot.autoconfigure.web.servlet.JspTemplateAvailabilityProvider

这些类都比较简单,可以自行探索

后续

更多博客,查看 https://github.com/senntyou/blogs

作者:深予之 (@senntyou)

版权声明:自由转载-非商用-非衍生-保持署名(创意共享 3.0 许可证

相关文章