SpringBoot 启动过程和自动装配

本文详细介绍了SpringBoot的启动过程,从SpringApplication.run()开始,包括初始化Listener和Initializer对象,经历7个启动状态,并重点讲解了配置环境变量、创建Context、beanFactory加载等步骤。同时,文章探讨了SpringBoot的自动装配过程,重点关注了prepareContext和refreshContext方法,以及BeanDefinitionRegistryPostProcessor的执行,特别提到了AutoConfigurationImportSelector在自动配置中的作用。
摘要由CSDN通过智能技术生成

SpringBoot 启动过程和自动装配

SpringBoot启动过程

  • SpringBoot启动注解了@SpringBootApplication 的 xxxApplication的main方法中,SpringApplication.run(DemoApplication.class, args)这个是启动的开始位置。主要分为两个步骤:
  • 1、SpringApplication初始化META_INF/spring.factories中11个ApplicationListener类型的Listener对象和 7个ApplicationContextInitializer类型的Initializer对象。
  • 2、SpringApplication对象run()方法完成SpringBoot的启动过程。SpringBoot的启动过程有7中状态:ApplicationStartingEvent、ApplicationEnvironmentPreparedEvent、ApplicationContextInitializedEvent、ApplicationPreparedEvent、ApplicationStartedEvent、ApplicationReadyEvent和ApplicationFailedEvent。通过观察者模式,当有状态事件发生时,触发11个ApplicationListener中能够处理的Listener进行事件处理。SpringBoot的启动过程主要分为:1)配置环境变量(系统环境变量、配置文件参数);2)打印启动的banner信息;3)创建webApplicationType类型的Context(SERVLET、REACTIVE、 NONE);4)调用applyInitializers()进行7个ApplicationContextInitializer对象进行初始化添加3个Processor(CachingMetadataReaderFactoryPostProcessor、ConfigurationWarningsPostProcessor、PropertySourceOrderingPostProcessor和Listener添加,以及其他初始化操作,打印starting启动日志,beanFactory load SpringBootApplication的SpringBoot启动类,向beanFactory 注册到beanDefinitionMap中;5)调用spring AbstractApplicationContext refresh进行类的加载
    context进行简单的属性初始化准备下环境;6)打印服务启动的时间的日志。具体流程见图:
    在这里插入图片描述
  • 3启动流程的关键源码:
//在SpringApplication构造函数中初始化

//META_INF/spring.factories中11个ApplicationListener类型的Listenner对象和 7个ApplicationContextInitializer类型的Initializer对象
//# Application Listeners spring-boot
//org.springframework.context.ApplicationListener=\
//org.springframework.boot.ClearCachesApplicationListener,\
//org.springframework.boot.builder.ParentContextCloserApplicationListener,\
//org.springframework.boot.cloud.CloudFoundryVcapEnvironmentPostProcessor,\
//org.springframework.boot.context.FileEncodingApplicationListener,\
//org.springframework.boot.context.config.AnsiOutputApplicationListener,\
//org.springframework.boot.context.config.ConfigFileApplicationListener,\
//org.springframework.boot.context.config.DelegatingApplicationListener,\
//org.springframework.boot.context.logging.ClasspathLoggingApplicationListener,\
//org.springframework.boot.context.logging.LoggingApplicationListener,\
//org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener
//# Application Listeners spring-boot-autoconfigure
//org.springframework.context.ApplicationListener=\
//org.springframework.boot.autoconfigure.BackgroundPreinitializer

//# Application Context Initializers
//org.springframework.context.ApplicationContextInitializer=\
//org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer,\
//org.springframework.boot.context.ContextIdApplicationContextInitializer,\
//org.springframework.boot.context.config.DelegatingApplicationContextInitializer,\
//org.springframework.boot.rsocket.context.RSocketPortInfoApplicationContextInitializer,\
//org.springframework.boot.web.context.ServerPortInfoApplicationContextInitializer
//# Initializers
//org.springframework.context.ApplicationContextInitializer=\
//org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
//org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
   
                this.resourceLoader = resourceLoader;
                Assert.notNull(primarySources,<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值