zoukankan      html  css  js  c++  java
  • Springboot 2启动源码流程

    以使用静态方法SpringApplication.run(Bootstrap.class, args)启动 Springboot 为例,启动流程主要分为 SpringApplication 的创建和运行两部分;

    创建

    1. 设置资源加载器,此处为空
    2. 设置 Springboot 启动类
    3. 根据类路径判断 web 类型,默认为 SERVLET->Spring MVC
    4. 读取每个 jar 包的 /META-INF/spring.factories 文件,获取 key 为 org.springframework.context.ApplicationContextInitializer 的值,即初始化器
    5. 读取每个 jar 包的 /META-INF/spring.factories 文件,获取 key 为 org.springframework.context.ApplicationListener 的值,即监听器
    6. 从当前的运行时堆栈元素中,找到 main 方法所在类

    运行

    1. 启动计时秒表
    2. 读取每个 jar 包的 /META-INF/spring.factories 文件,获取 key 为 org.springframework.boot.SpringApplicationRunListener 的值,即 Springboot 的运行监听器,默认有 EventPublishingRunListener
    3. 启动监听器,使用事件派发器向监听器派发 ApplicationStartingEvent 事件
    4. 根据命令行参数 args 初始化 DefaultApplicationArguments
    5. 获取环境配置,绑定到 Spring 应用,并派发 ApplicationEnvironmentPreparedEvent 事件
    6. 配置 spring.beaninfo.ignore 指定的可以忽略的 Bean
    7. 打印 Banner
    8. 根据 web 类型创建上下文,默认为 AnnotationConfigServletWebServerApplicationContext
    9. 读取每个 jar 包的 /META-INF/spring.factories 文件,获取 key 为 org.springframework.boot.SpringBootExceptionReporter 的值,即失败分析器,默认有 FailureAnalyzers
    10. 准备上下文,即给它配置属性,回调初始化器,并派发 ApplicationPreparedEvent 事件
    11. 刷新容器,创建 Bean 的过程,调用 refresh() 方法,见 Spring 源码总结
    12. 刷新后的处理,空方法,子类可以实现该方法做额外的处理
    13. 停止秒表,打印启动时长
    14. 派发 ApplicationStartedEvent 事件
    15. 调用 ApplicationRunner、CommandLineRunner 的实现方法
    16. 派发 ApplicationReadyEvent 事件
    17. 如果启动过程发生异常,派发 ApplicationFailedEvent 事件,并执行失败分析器

    一些初始化器和监听器的作用

    初始化器

    1. DelegatingApplicationContextInitializer:获取环境配置 context.initializer.classes 指定的初始化器。
    2. ContextIdApplicationContextInitializer:初始化 Spring 应用名 ID:profile:PORT。(spring.application.name:spring.profiles.active:spring.application.name)
    3. ConfigurationWarningsApplicationContextInitializer:初始化配置检查,输出警告日志。
    4. ServerPortInfoApplicationContextInitializer:初始化对 WebServerInitializedEvent 事件的监听,将监听器添加到派发器
    5. SharedMetadataReaderFactoryContextInitializer:初始化元数据读取和缓存的后置处理器 CachingMetadataReaderFactoryPostProcessor。

    监听器

    1. ConfigFileApplicationListener:加载默认路径下的配置文件。
    2. AnsiOutputApplicationListener:监听 spring.output.ansi.enabled 是否配置了彩色输出日志。always:启用彩色输出;ever禁用彩色输出;detect:(默认)自动检测。
    3. LoggingApplicationListener:配置日志系统。
    4. ClasspathLoggingApplicationListener:打印程序开始启动和启动失败 classpath 的 debug 日志。
    5. BackgroundPreinitializer:起一个后台线程触发早期的初始化器,包括校验器、消息转换器等。(MessageConverterInitializer、MBeanFactoryInitializer、ValidationInitializer、JacksonInitializer、ConversionServiceInitializer)
    6. DelegatingApplicationListener:获取环境配置 context.listener.classes 指定的监听器
    7. ParentContextCloserApplicationListener:如果父关闭了,则关闭应用程序上下文。它监听 refresh 事件来获取上下文,监听到关闭事件后进行传播。
    8. FileEncodingApplicationListener:如果系统文件和环境中配置的编码不匹配,则停止应用程序。
    9. ClearCachesApplicationListener:上下文加载后清理缓存。
  • 相关阅读:
    CCF-CSP的第三题们么
    STL
    信息安全-期末复习
    NLP自然语言处理
    python 处理文件
    信息安全-简易的DES加解密--3DES
    试药的常见问题
    关于试药的那些事
    Excel的单列和多列的拆分与合并
    Excel中的文本提取操作
  • 原文地址:https://www.cnblogs.com/bigshark/p/11355655.html
Copyright © 2011-2022 走看看