springboot启动流程

//创建SpringApplication实例
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
   this.resourceLoader = resourceLoader;
   Assert.notNull(primarySources, "PrimarySources must not be null");
   //将main启动类存入set
   this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
   //判断是否是web
   this.webApplicationType = WebApplicationType.deduceFromClasspath();
   //第一次通过SPI去读取spring.factories 创建并初始化ApplicationInitializers
   setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
   //第二次去读取spring.factories 创建初始化ApplicationListeners
   setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
   //初始化主类
   this.mainApplicationClass = deduceMainApplicationClass();
}
 //启动run方法

public ConfigurableApplicationContext run(String... args) {
   //创建stopwatch计时器,并启动
   StopWatch stopWatch = new StopWatch();
   stopWatch.start();
   ConfigurableApplicationContext context = null;
   Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
   configureHeadlessProperty();
   //获取SpringApplicationRunListeners
   SpringApplicationRunListeners listeners = getRunListeners(args);
   //启动ApplicationRunListeners
   listeners.starting();
   try {
      //创建ApplicationArguments
      ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
      //创建并实例化ConfigurableEnvironment
      ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
      configureIgnoreBeanInfo(environment);
      Banner printedBanner = printBanner(environment);
      //创建ConfigableApplicationContext
      context = createApplicationContext();
      exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,
            new Class[] { ConfigurableApplicationContext.class }, context);
      //准备ConfigableApplicationContext
      prepareContext(context, environment, listeners, applicationArguments, printedBanner);
      //刷新ConfigableApplicationContext
      refreshContext(context);
      //容器刷新后动作
      afterRefresh(context, applicationArguments);
      //计时器停止
      stopWatch.stop();
      if (this.logStartupInfo) {
         new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
      }
      //发布ApplicationStartedEvent事件
      listeners.started(context);
      //调用ApplicationRunner,CommandLineRunner的run方法
      callRunners(context, applicationArguments);
   }
   catch (Throwable ex) {
      handleRunFailure(context, ex, exceptionReporters, listeners);
      throw new IllegalStateException(ex);
   }

   try {
      listeners.running(context);
   }
   catch (Throwable ex) {
      handleRunFailure(context, ex, exceptionReporters, null);
      throw new IllegalStateException(ex);
   }
   return context;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值