SpringBoot启动流程源码解析

SpringBoot启动流程源码解析

SpringApplication 的职责是建立一个ApplicationContext
SpringFactoriesLoader加载相似于SPI机制
Spring会去找META-INF/spring.factories文件(文件存在多个),找到对应的实现类的全类名进行加载java

SpringApplication建立ApplicationContext`的过程

SpringApplication.initialize()

推断WebEnvironment,

javax.servlet.Servlet
org.springframework.web.context.ConfigurableWebApplicationContext spring会去判断这俩个类是否都存在,都存在的话就会设置webEnvironment为Trueweb

初始化ApplicationContextInitializer

经过SpringFactoriesLoader加载机制,将 org.springframework.context.ApplicationContextInitializer对应的Context进行加载 > org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer > org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer > org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer > org.springframework.boot.context.ContextIdApplicationContextInitializer > org.springframework.boot.context.config.DelegatingApplicationContextInitializer > org.springframework.boot.context.embedded.ServerPortInfoApplicationContextInitializerspring

初始化Listener

经过SpringFactoriesLoader加载机制,将org.springframework.context.ApplicationListener对应的Listener进行加载bootstrap

org.springframework.boot.autoconfigure.BackgroundPreinitializer org.springframework.cloud.bootstrap.BootstrapApplicationListener org.springframework.cloud.bootstrap.LoggingSystemShutdownListener org.springframework.cloud.context.restart.RestartListener org.springframework.boot.ClearCachesApplicationListener org.springframework.boot.builder.ParentContextCloserApplicationListener 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.liquibase.LiquibaseServiceLocatorApplicationListener org.springframework.boot.logging.ClasspathLoggingApplicationListener org.springframework.boot.logging.LoggingApplicationListenerui

推断拥有main方法的类

Spring会拿当前线程的堆栈信息,而后遍历堆栈中的方法帧,查看是否有方法名等于main的方法帧spa

SpringApplication.run()

加载SpringApplicationRunListener

SpringApplicationRunListener会在在SpringApplicationrun()方法中建立ApplicationContext的各个步骤作相应的处理 SpringApplicationRunListenersSpringApplicationRunListener 的集合类 SpringApplicationRunListeners类负责管理在SpringApplicationrun()方法中建立ApplicationContext的各个步骤,一共有5个步骤,starting()->environmentPrepared()->contextPrepared()->contextLoaded()->finished(),在每一个步骤中会调用具体的SpringApplicationRunListener实现类去作相应的事情命令行

经过SpringFactoriesLoader加载机制,将org.springframework.boot.SpringApplicationRunListener对应的SpringApplicationRunListener进行加载线程

EventPublishingRunListenerrest

  • 执行SpringApplicationRunListeners.start()方法 在该方法中利用了SpringApplicationRunListener实现类EventPublishingRunListenerApplicationListener实现类广播了ApplicationStartedEvent事件

响应了ApplicationStartedEvent事件的ApplicationListener org.springframework.boot.logging.LoggingApplicationListener org.springframework.boot.context.config.DelegatingApplicationListener org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListenercode

建立Environment以及对Environment进行相应的配置

Environment接口表明Spring应用的上下文环境,保存了Spring应用的配置文件和系统属性

  • 示例化Environment 会根据是否在Web环境上示例化对应Environment实现类,若是是Web环境,就建立StandardServletEnvironment,不是则建立StandardEnvironment,StandardServletEnvironmentServletJNDI的属性进行了设置
  • 将命令行参数配置进Environment当中,具体方法SpringApplication.configurePropertySources()

能够利用SpringApplication.addCommandLineProperties 属性对命令行参数进行禁用

  • 设置EnvironmentactiveProfiles,从spring.profiles.active属性中读取
  • 执行SpringApplicationRunListeners.environmentPrepared()方法 在该方法中利用了SpringApplicationRunListener实现类EventPublishingRunListenerApplicationListener实现类广播了ApplicationEnvironmentPreparedEvent事件 >响应了ApplicationEnvironmentPreparedEvent事件的ApplicationListener >org.springframework.cloud.bootstrap.BootstrapApplicationListener >org.springframework.cloud.bootstrap.LoggingSystemShutdownListener >org.springframework.boot.context.config.ConfigFileApplicationListener >org.springframework.boot.context.config.AnsiOutputApplicationListener >org.springframework.boot.logging.LoggingApplicationListener >org.springframework.boot.autoconfigure.BackgroundPreinitializer >org.springframework.boot.logging.ClasspathLoggingApplicationListener >org.springframework.boot.context.config.DelegatingApplicationListener >org.springframework.boot.context.FileEncodingApplicationListener

建立ApplicationContext以及对ApplicationContext进行相应的配置

  • 实例化ApplicationContext 会根据是否在Web环境上示例化对应ApplicationContext实现类,若是是Web环境,就建立AnnotationConfigEmbeddedWebApplicationContext,不是则建立AnnotationConfigApplicationContext
  • 将建立好的Environment设置进ApplicationContext
  • ApplicationContext进行前置处理 若是指定了BeanNameGeneratorResourceLoader,会设置到ApplicationContext
  • 执行ApplicationContextInitializer

org.springframework.cloud.bootstrap.BootstrapApplicationListener$AncestorInitializer org.springframework.cloud.bootstrap.BootstrapApplicationListener$DelegatingEnvironmentDecryptApplicationInitializer org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration$$EnhancerBySpringCGLIB$$d551191c org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer org.springframework.boot.context.config.DelegatingApplicationContextInitializer org.springframework.boot.context.ContextIdApplicationContextInitializer org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer org.springframework.boot.context.embedded.ServerPortInfoApplicationContextInitializer

  • 执行SpringApplicationRunListeners.contextPrepared()方法
  • 注册命令行参数bean,DefaultApplicationArguments
  • 加载sourcesApplicationContext
  • 执行SpringApplicationRunListeners.contextLoaded()方法 在这一步首先会将如今的ApplicationListener注册到ApplicationContext当中,而后再利用了SpringApplicationRunListener实现类EventPublishingRunListenerApplicationListener实现类广播了ApplicationPreparedEvent事件

添加到ApplicationContextApplicationListener org.springframework.cloud.bootstrap.BootstrapApplicationListener org.springframework.cloud.bootstrap.LoggingSystemShutdownListener org.springframework.boot.context.config.ConfigFileApplicationListener org.springframework.boot.context.config.AnsiOutputApplicationListener org.springframework.boot.logging.LoggingApplicationListener org.springframework.boot.autoconfigure.BackgroundPreinitializer org.springframework.boot.logging.ClasspathLoggingApplicationListener org.springframework.cloud.context.restart.RestartListener org.springframework.boot.context.config.DelegatingApplicationListener org.springframework.boot.builder.ParentContextCloserApplicationListener org.springframework.boot.ClearCachesApplicationListener org.springframework.boot.context.FileEncodingApplicationListener org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener 响应了ApplicationPreparedEvent事件的ApplicationListener org.springframework.boot.context.config.ConfigFileApplicationListener org.springframework.boot.logging.LoggingApplicationListener org.springframework.cloud.context.restart.RestartListener org.springframework.boot.context.config.DelegatingApplicationListener

  • refreshContext()
  • afterRefresh() 执行实现了ApplicationRunnerCommandLineRunner的bean
  • 执行SpringApplicationRunListeners.finished()方法
相关文章
相关标签/搜索