赞
踩
启动顺序主要针对SpringApplication.run()方法的梳理
BootstrapRegistryInitializer接口实例化
1).加载 BootstrapRegistryInitializer实现类 ,由 SpringFactoriesLoader 类加载定义在 META-INF/spring.factories 文件夹下的配置文件Resource 初始化资源列表 Map<ClassLoader, MultiValueMap<String, String>>
2).加载实例化BootstrapRegistryInitializer的实现类
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
org.springframework.boot.autoconfigure.BackgroundPreinitializer
创建ConfigurableBootstrapContext上下文。 this.createBootstrapContext(),执行BootstrapRegistryInitializer接口的实例化类调用执行。
SpringApplicationRunListeners的实例化以及相关实现类的调用
1).实例化 SpringApplicationRunListeners,启动 SpringApplicationRunListeners的监听
由 SpringFactoriesLoader 类加载 SpringApplicationRunListeners 实现类实例化 。定义在 META-INF/spring.factories 文件夹下的配置文件Resource 初始化资源列表 Map<ClassLoader, MultiValueMap<String, String>>
2).遍历调用所有SpringApplicationRunListeners的starting方法,执行SpringApplicationRunListeners的实例化执行
实例化 ConfigurableEnvironment ,由listeners,bootstrapContext,applicationArguments设置启动springboot启动的环境配置信息
1)设置命令行变量、配置文件变量加入到ConfigurableEnvironment 加入到环境变量中
2)执行SpringApplicationRunListeners实例化中,ApplicationStartup的start方法
打印Banner
创建ConfigurableApplicationContext类,通过ApplicationContextFactory 上下文创建ConfigurableApplicationContext容器,设置启动类的ApplicationStartup
创建加载SpringBootExceptionReporter
1).加载 创建加载SpringBootExceptionReporter 实现类 ,定义在 META-INF/spring.factories 文件夹下的配置文件Resource 初始化资源列表 Map<ClassLoader, MultiValueMap<String, String>>
2).创建加载SpringBootExceptionReporter 的实现类
初始化容器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 之间的依赖,而不是在初始化阶段发现无法解决的循环依赖。
更新上下文 refreshContext
1) 通过registerShutdownHook 钩子方法判断容器是进行开启还是关闭
2) 给context执行refresh()
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种方式
打印启动日志 logStartupInfo
执行接口事件、ApplicationRunner、CommandLineRunner接口事件集合
避免看springboot的源码迷路雨里雾里的最好的方法就是依据spring 的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,通常有两种方式:
1、在xml中使用等标签进行标记注册;
2、直接在java类上,使用注解形式,如@Component、@Controller、@Service、@Configuration等;
3、第三种比较特殊,利用Spring提供的一些扩展点,直接硬编码的形式实例化好的bean进行注册,如实现FactoryBean接口;
详细参考上面: Spring注解驱动开发—向Spring Ioc容器中注册Bean的7种方式
平时看到的大部分文章的分享,基本是都是分享的这一阶段的内容,这一部分也是步骤最多、逻辑较为复杂的一部分,但是只要把据好两个关键时机,这一部分也可以变得很简单,那这两个时机是什么呢?就是bean的实例化、bean的属性注入。有的小伙伴看源码,看着看着都云里雾里,思路不知道都偏到哪里去了,最后脑子里一片茫然,这是因为没有把握好Bean生命周期的关键。
Bean生命周期的关键是什么呢?答案就是Bean,这可不是废话。不信你试试,所有分析都不要离开bean,牢牢盯好bean在生命周期过程中的变化,你看还会在源码里迷路不?
bean的实例化,也不神秘,即通过java反射调用无参数构造方法或有参数构造方法进行bean实例化,默认是调用无参数构造方法;bean属性注入是指引用Spring容器内对象的属性赋值,即依赖注入;我觉得Spring之所以伟大,除了以上部分,Spring bean生命周期最为值得研究和学习的就在于Bean实例过前后各种丰富、灵活的扩展操作,不仅Spring自己内部在使用,也以接口的形式对外由开发者按自己需要进行实现。因此,我花了一些时间,输出一系列的文章来分享Spring扩展点的功能特性、实现方式、工作原理,如果想从更加微观的角度去了解Spring bean生命周期,可以参考阅读下面这些文章:
参考: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生命周期涉及主要接口、类的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;
1、在Spring容器开始启动到Spring bean(这里主要是指业务中的非懒加载的单例bean)实例化前,是beanFactory级别的扩展接口触发执行,整个生命周期仅执行一次,如ApplicationContextInitializer、BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor;
2、接着通过反射调用bean的构造方法完成bean实例化、bean依赖属性注入;
3、在bean实例化、bean依赖属性注入的前后,bean级别的扩展接口、bean自向的方法触发执行,直到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在启动的时候,启动加载jar包下META-INF/spring.factories文件,然后SpringFactoriesLoader.loadFactoryNames加载实例化实现指定注解,接口的实现类,完成完成对应的自动装配。
例如 springbootApplicatin启动类下的@ EnableAutoConfiguration 注解,加载装配配置类;通过EnableAutoConfiguration 注解类,加载实例化org.springframework.boot.autoconfigure.EnableAutoConfiguration配置清单下的配置类。
SpringFactoriesLoader.loadFactoryNames加载类说明,是根据类型加载类
loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader)```
# 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。