spring-boot 启动

  • spingboot-start
    • SpringApplication构造方法
      • 使用 SpringFactoriesLoader 在 classpath 中查找并加载所有可用的 ApplicationContextInitializer
      • 使用 SpringFactoriesLoader 在 classpath 中查找并加载所有可用的 ApplicationListener
      • 通过stackTrace里的main方法查找启动类
    • SpringApplication.run()
      • 创建StopWatch计时器
      • 通过 SpringFactoriesLoader 查找并加载 SpringApplicationRunListener 列表,调用 SpringApplicationRunListener.started() 方法
      • 创建Environment
        • configureEnvironment()
        • listeners.environmentPrepared(): 广播 ApplicationEnvironmentPreparedEvent 事件
      • 打印banner
      • createApplicationContext(): 创建applicationContext
      • prepareContext()
        • context.setEnvironment()
        • postProcessApplicationContext()
        • applyInitializers():调用 initializers.initialize()
        • listeners.contextPrepared():广播 ApplicationContextInitializedEvent
        • load():加载 beanDefinitions
        • listeners.contextLoaded()
          • 1.若listener实现了 ApplicationContextAware 接口,调用 setApplicationContext()
          • 2.广播ApplicationPreparedEvent事件
      • refreshContext():调用 spring 的 refresh()方法
        • AbstractApplicationContext.refresh()逻辑
      • afterRefresh():钩子,目前 do nothing
      • 广播 ApplicationStartedEvent 事件
      • callRunners()
        • 调用ApplicationRunner和CommandLineRunner类型对象的run()方法
      • 若上面执行有异常,则handleRunFailure()
      • listeners.running():广播ApplicationReadyEvent事件