当前位置:   article > 正文

springboot启动流程梳理

springboot启动流程梳理

启动顺序主要针对SpringApplication.run()方法的梳理

一 SpringApplication类的实例化

  1. BootstrapRegistryInitializer接口实例化
    1).加载 BootstrapRegistryInitializer实现类 ,由 SpringFactoriesLoader 类加载定义在 META-INF/spring.factories 文件夹下的配置文件Resource 初始化资源列表 Map<ClassLoader, MultiValueMap<String, String>>
    2).加载实例化BootstrapRegistryInitializer的实现类

  2. ApplicationContextInitializer 实现类的资源配置文件读取以及实现相关类的实例化
    1).加载 ApplicationContextInitializer 实现类 ,由 SpringFactoriesLoader 类加载定义在 META-INF/spring.factories 文件夹下的配置文件Resource 初始化资源列表 Map<ClassLoader, MultiValueMap<String, String>>
    2).加载实例化ApplicationContextInitializer 的实现类 ,springboot启动内置的实例化类:

org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
  • 1
  • 2
  1. ApplicationListener 接口类的资源配置文件的读取以及实例化
    1).加载 ApplicationListener 实现类 ,由 SpringFactoriesLoader 类加载定义在 META-INF/spring.factories 文件夹下的配置文件Resource 初始化资源列表 Map<ClassLoader, MultiValueMap<String, String>>
    2) ApplicationListener 的实现类,springboot内置的实例化类
org.springframework.boot.autoconfigure.BackgroundPreinitializer
  • 1

二 SpringApplication.run()启动方法

  1. 创建ConfigurableBootstrapContext上下文。 this.createBootstrapContext(),执行BootstrapRegistryInitializer接口的实例化类调用执行。

  2. SpringApplicationRunListeners的实例化以及相关实现类的调用
    1).实例化 SpringApplicationRunListeners,启动 SpringApplicationRunListeners的监听
    由 SpringFactoriesLoader 类加载 SpringApplicationRunListeners 实现类实例化 。定义在 META-INF/spring.factories 文件夹下的配置文件Resource 初始化资源列表 Map<ClassLoader, MultiValueMap<String, String>>
    2).遍历调用所有SpringApplicationRunListeners的starting方法,执行SpringApplicationRunListeners的实例化执行

  3. 实例化 ConfigurableEnvironment ,由listeners,bootstrapContext,applicationArguments设置启动springboot启动的环境配置信息
    1)设置命令行变量、配置文件变量加入到ConfigurableEnvironment 加入到环境变量中
    2)执行SpringApplicationRunListeners实例化中,ApplicationStartup的start方法

  4. 打印Banner

  5. 创建ConfigurableApplicationContext类,通过ApplicationContextFactory 上下文创建ConfigurableApplicationContext容器,设置启动类的ApplicationStartup

  6. 创建加载SpringBootExceptionReporter
    1).加载 创建加载SpringBootExceptionReporter 实现类 ,定义在 META-INF/spring.factories 文件夹下的配置文件Resource 初始化资源列表 Map<ClassLoader, MultiValueMap<String, String>>
    2).创建加载SpringBootExceptionReporter 的实现类

  7. 初始化容器prepareContext
    根据初始化的ConfigurableApplicationContext、ConfigurableEnvironment、SpringApplicationRunListeners、ApplicationArguments、Banner 准备初始化上下文context
    1) .设置实现ApplicationContextInitializer 的实现类的context属性,包括environment,resourceLoader,classLoader,给ApplicationContextInitializer实例化,配置context属性值
    2) .设置listener的context属性
    3). 打印启动日志和profile文件信息
    4).从context中获取加载bean的beanFactory(ConfigurableListableBeanFactory),设置beanfactory 的applicationArgument、Banner属性值,设置beanFactory 的属性 ,加载bean的时候是否循环依赖allowCircularReferences,设置beanFactory的属性 ,加载bean 时候是否允许同名bean的覆盖属性allowBeanDefinitionOverriding,springboot默认false
    5) .设置context 属性 lazyInitialization ,配置是否延迟加载懒加载的bean,设置context的属性BeanFactoryPostProcessor
    6).从context中获取、创建、加载bean的BeanDefinitionLoader,给BeanDefinitionLoader设置resourceLoader、environment
    7)给SpringApplicationRunListeners 发布conext事件

懒加载的bean配合@Lazy注解使用。懒加载好处:
节省资源:当应用程序中存在大量的 bean 时,立即初始化所有 bean 可能会占用大量的内存和处理时间。通过延迟初始化,只有在需要使用 bean 时才会进行初始化,可以避免不必要的资源消耗。
加快启动时间:延迟初始化可以减少应用程序启动时间,因为只有在需要时才会加载和初始化
bean。对于那些在应用程序启动时可能不会使用的较大或复杂的 bean,延迟初始化可以显著加快启动时间。
解决循环依赖: Spring 容器可以管理bean之间的依赖关系。当存在循环依赖时,延迟初始化可以帮助解决这个问题。通过延迟初始化,Spring
容器可以在运行时逐个解析和满足 bean 之间的依赖,而不是在初始化阶段发现无法解决的循环依赖。

  1. 更新上下文 refreshContext
    1) 通过registerShutdownHook 钩子方法判断容器是进行开启还是关闭
    2) 给context执行refresh()

    • (1)设置ApplicationStartup任务执行步骤:spring.context.refresh 标记
    • (2)执行 prepareRefresh() 方法,设置context 的状态为active
    • (3)设置ApplicationStartup任务执行步骤:spring.context.beans.post-process 标记beanFactory的后置处理器任务开始标记
    • (4)bean的实例化 ,通过beanFactrory 获取beanFactory的后置处理器任务集合 beanFactoryPostProcessors(beanFactory级别的后置处理器),执行每个beanFactory的后置处理器任务postProcessBeanFactory ,实例化bean 。 (在invokeBeanFactoryPostProcessors(beanFactory)这一步实现了bean在容器中的实例化这一步中实现,每个beanFactory级别的后置处理器任务postProcessBeanFactory 只会只会执行一次)

    beanFactory(ConfigurableListableBeanFactory) 的实现类DefaultListableBeanFactory 实现了BeanDefinitionRegistry接口,可以实现对bean的注册、移除、查询、数量管理等。加载的实例对象被定义为BeanDefinition,存放在beanfactory 的 Map<String, BeanDefinition> beanDefinitionMap 变量中进行管理;通过BeanDefinitionRegistryPostProcessor接口的实例可以实现对xml、bean注解、config等注解标记、以及第三方jar包中自定义注解实现的bean的扫描以及实例化
    详情参考Spring的Bean定义注册中心BeanDefinitionRegistry详解
    Spring注解驱动开发—向Spring Ioc容器中注册Bean的7种方式

    • (5) 初始化国际化资源,实现了HierarchicalMessageSource接口
    • (4)初始化spring容器实践,实现了ApplicationEventMulticaster接口
    • (5)onRefresh() 更新主题资源,实现了HierarchicalThemeSource接口, 创建ServletContext
    • (6)注册监监听事件ApplicationListener事件,获取ApplicationListener实现接口集合,执行广播监听 (ApplicationEventMulticaster接口实现类),执行对应的excute方法;执行 listener.onApplicationEvent(event)方法;
    • (7)加载通过字节码载入字节码文件时动态织入Aspect切面,LoadTimeWeaverAware接口
    • (8) 加载实例化LifecycleProcessor接口,调用start/stop相关接口
      在Spring中还提供了Lifecycle接口,Lifecycle接口中包含start/stop方法,实现此接口后Spring会保证在启动的时候调用其start方法开始生命周期,并在Spring关闭的时候调用stop方法来结束生命周期,通常用来配置后台程序,如启动后一直运行(如对MQ进行轮询等)。而ApplicationContext的初始化最后一步就是保证了这一功能的实现。
    • (9) 调用ContextRefreshedEvent 事件机制,实现ApplicationContextEvent实现ApplicationEvent 抽象类
  2. 打印启动日志 logStartupInfo

  3. 执行接口事件、ApplicationRunner、CommandLineRunner接口事件集合

Bean的生命周期

避免看springboot的源码迷路雨里雾里的最好的方法就是依据spring 的bean的生命周期去看,看看当前的代码属于bean周期的哪一步。

Bean的生命周期指的是什么?

简单理解,Spring bean的生命周期,就是普通java类变为Spring管理的Bean的过程,即Spring的核心之一控制反转,即把原来对象创建的控制权由用户程序交由Spring管理。而Spring对普通java类的管理,大致分为两步:第一,先把纳入到Spring管理的java类抽象为一个beanDefinition对象;第二,再根据beanDefinition完成java类的实例化、属性注入、其他的一些Spring特有的扩展操作;第三,这时就可以使用Spring管理的bean,直到bean被销毁。通过这三步普通java类完成了到Spring bean的一个转变,或者说宏观过程来看,这就是Spring bean一个生命周期过程。

普通java类到BeanDefinition

从普通的java类到BeanDefinition,通常有两种方式:

1、在xml中使用等标签进行标记注册;

2、直接在java类上,使用注解形式,如@Component、@Controller、@Service、@Configuration等;

3、第三种比较特殊,利用Spring提供的一些扩展点,直接硬编码的形式实例化好的bean进行注册,如实现FactoryBean接口;
详细参考上面: Spring注解驱动开发—向Spring Ioc容器中注册Bean的7种方式

从BeanDefinition到bean的销毁

平时看到的大部分文章的分享,基本是都是分享的这一阶段的内容,这一部分也是步骤最多、逻辑较为复杂的一部分,但是只要把据好两个关键时机,这一部分也可以变得很简单,那这两个时机是什么呢?就是bean的实例化、bean的属性注入。有的小伙伴看源码,看着看着都云里雾里,思路不知道都偏到哪里去了,最后脑子里一片茫然,这是因为没有把握好Bean生命周期的关键。

Bean生命周期的关键是什么呢?答案就是Bean,这可不是废话。不信你试试,所有分析都不要离开bean,牢牢盯好bean在生命周期过程中的变化,你看还会在源码里迷路不?

bean的实例化,也不神秘,即通过java反射调用无参数构造方法或有参数构造方法进行bean实例化,默认是调用无参数构造方法;bean属性注入是指引用Spring容器内对象的属性赋值,即依赖注入;我觉得Spring之所以伟大,除了以上部分,Spring bean生命周期最为值得研究和学习的就在于Bean实例过前后各种丰富、灵活的扩展操作,不仅Spring自己内部在使用,也以接口的形式对外由开发者按自己需要进行实现。因此,我花了一些时间,输出一系列的文章来分享Spring扩展点的功能特性、实现方式、工作原理,如果想从更加微观的角度去了解Spring bean生命周期,可以参考阅读下面这些文章:

springboot 扩展点详解

参考:https://blog.csdn.net/fox9916/article/details/129101918
1、Springboot扩展点之ApplicationContextInitializer

2、Springboot扩展点之BeanFactoryPostProcessor

3、Springboot扩展点之BeanDefinitionRegistryPostProcessor

4、Springboot扩展点之BeanPostProcessor

5、Springboot扩展点之InstantiationAwareBeanPostProcessor

6、Springboot扩展点之SmartInstantiationAwareBeanPostProcessor

7、Springboot扩展点之ApplicationContextAwareProcessor

8、Springboot扩展点之@PostConstruct

9、Springboot扩展点之InitializingBean

10、Springboot扩展点之SmartInitializingSingleton

11、Springboot扩展点之CommandLineRunner和ApplicationRunner

12、Springboot扩展点之FactoryBean

13、Springboot扩展点之DisposableBean

原文链接:https://blog.csdn.net/fox9916/article/details/129101918

Spring bean生命周期流程图如下:

在这里插入图片描述
Spring bean生命周期涉及主要接口、类的UML关系图如下:
在这里插入图片描述
Spring bean生命周期过程,很复杂,但是也有条不紊,主要涉及的的扩展接口有ApplicationContextInitializer、BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor、InstantiationAwareBeanPostProcessor、InitializingBean、BeanPostProcessor、SmartInitializingSingleton、CommandLineRunner、DisposableBean。接口看起来不少,实际上可以分为三类:

1、beanFactory级别:仅在Spring容器启动时执行一次,ApplicationContextInitializer、BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor;

2、bean级别:每个bean实例化、依赖属性注入前后都会触发,InstantiationAwareBeanPostProcessor、BeanPostProcessor;

3、bean自身的方法:bean需要通过属性指定、注解标记或实现接口,如init-method、destroy-method、@PostConstruct注解标记的方法、InitializingBean、DisposableBean、FactoryBean、SmartInitializingSingleton、CommandLineRunner;

概括一下Spring bean生命周期:

1、在Spring容器开始启动到Spring bean(这里主要是指业务中的非懒加载的单例bean)实例化前,是beanFactory级别的扩展接口触发执行,整个生命周期仅执行一次,如ApplicationContextInitializer、BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor;

2、接着通过反射调用bean的构造方法完成bean实例化、bean依赖属性注入;

3、在bean实例化、bean依赖属性注入的前后,bean级别的扩展接口、bean自向的方法触发执行,直到bean销毁,Spring bean的生命周期结束;

面试中经常问Spring Bean生命周期的目的是什么?

其实这个问题对于面试者业说不好回答,因为它实际涉及的内容很多、很广,但是面试官爱问也是有原因的,面试官通过这个问题可以考察到面试者对于Spring从宏观到微观的认识有多深,如果面试者的回答只是几分钟、三言两语,面试官基本上可判定面试者的技术水平比较初级了;如果面试者就这一个问题能聊上一个半小时,依然没有要结束的意思,那么说明面试者对这块理解比较深刻,能力水平自然不必说了。

在面试中,怎么才能回答好这个问题呢?
如果面试官不问你Spring bean的生命周期,是不是学习Spring bean生命周期就没有用了呢?

当然不,Spring生命周期的内容,是Spring的核心、灵魂。不管面试官问什么,你都可以往这上面引。

比如说,面试官问:”平时开发过程中使用Spring boot吗?对Springboot你的理解是什么?“

相信大多数的java项目都会使用Spring、Springboot,可以这样回答:Springboot实际上按约定大于配置的开发原则,对Spring原来XML配置的方式进行简化、包装,可以达到开箱即用,简化开发,提高开发效率,但是其核心依然是Spring。(话锋一转,开始往Spring生命周期上引),而Spring的最重要的核心是IOC,IOC管理的对象就是Spring bean,Spring bean生命周期内的又提供了各种优秀扩展接口和内部实现,也可以根据业务需要自定义实现,非常灵活和方案。然后就可以慢慢聊有哪些扩展接口、功能特性是什么、怎么使用、工作原理是什么,聊上三四个扩展接口,半个小时都不够用。

总结

当然,学习Spring生命周期的内容,并不只是为了面试,其中扩展接口的设计思想、扩展接口在功能特性都可以应用到业务开发中。
https://blog.csdn.net/fox9916/article/details/129101918

springboot 启动流程图

在这里插入图片描述

springboot 创建上下文 createApplicationContext 过程

在这里插入图片描述

spring-boot -autoconfig自动装配模块下META-INF/spring.factories自动装配清单

springboot在启动的时候,启动加载jar包下META-INF/spring.factories文件,然后SpringFactoriesLoader.loadFactoryNames加载实例化实现指定注解,接口的实现类,完成完成对应的自动装配。
例如 springbootApplicatin启动类下的@ EnableAutoConfiguration 注解,加载装配配置类;通过EnableAutoConfiguration 注解类,加载实例化org.springframework.boot.autoconfigure.EnableAutoConfiguration配置清单下的配置类。

SpringFactoriesLoader.loadFactoryNames加载类说明,是根据类型加载类

 loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader)```
  • 1
# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer

# Auto Configuration Import Listeners
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener

# 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

# Auto Configure
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.cloud.CloudServiceConnectorsAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
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.ElasticsearchAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
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.Neo4jRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
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.jest.JestAutoConfiguration,\
org.springframework.boot.autoconfigure.elasticsearch.rest.RestClientAutoConfiguration,\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
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.groovy.template.GroovyTemplateAutoConfiguration,\
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.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.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\
org.springframework.boot.autoconfigure.reactor.core.ReactorCoreAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.SecurityRequestMatcherProviderAutoConfiguration,\
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.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

# Failure analyzers
org.springframework.boot.diagnostics.FailureAnalyzer=\
org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\
org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\
org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer,\
org.springframework.boot.autoconfigure.session.NonUniqueSessionRepositoryFailureAnalyzer

# 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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/479550
推荐阅读
相关标签
  

闽ICP备14008679号