2.3.4 SpringBoot启动主流程

  1. SpringApplication.run()

  2. new SpringApplication()

    1. 配置resourceloader

    2. this.webApplicationType = WebApplicationType.deduceFromClasspath();

      判断当前应用程序的类型(serlvet,reactive,none)

    3. setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
      获取初始化器对象7个

    4. setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));

      获取监听器的实例对象11个

    5. this.mainApplicationClass = deduceMainApplicationClass();
      找到当前应用程序的主类,开始执行

  3. run启动

    1. stopWatch.start();
      开启计时器

    2. 定义异常报告器

    3. configureHeadlessProperty();
      配置java.awt.headless系统参数为true

    4. SpringApplicationRunListeners listeners = getRunListeners(args); listeners.starting();
      注册listeners
      创建监听器对象SpringApplicationRunListener,从配置文件中读取到EventPublishingRunListener

      创建eventpublicingrunlistener对象,并且创建出SimpleApplicationEventMulticaster,将application的11个监听器给到了当前对象,此时才能方便我们从中获取出符合监听事件的几个监听器

    5. ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);加载命令行的参数值,解析在命令中通过–key=value输入的属性值,封装到ApplicationArguments对象中

    6. ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
      准备应用程序的运行环境

      1. ConfigurableEnvironment environment = getOrCreateEnvironment();
        获取或者创建一个环境,根据当前应用程序的类型做判断
      2. configureEnvironment(environment, applicationArguments.getSourceArgs());
        对当前环境进行配置
      3. ConfigurationPropertySources.attach(environment);
        配置propertySource对它自己的递归依赖,添加一个属性
      4. listeners.environmentPrepared(environment);
        传播ApplicationEnvironmentPreparedEvent事件,向环境中添加两个属性
      5. bindToSpringApplication(environment)方法名称是将环境绑定给当前应用程序
      6. 对当前的环境类型做判断,如果不一致进行转换
      7. ConfigurationPropertySources.attach(environment);
    7. configureIgnoreBeanInfo(environment);
      设置spring.beaninfo.ignore的值为true,保证某些bean不会添加到准备环境中

    8. Banner printedBanner = printBanner(environment);
      根据配置输出banner

    9. context = createApplicationContext();
      根据应用程序类型创建上下文对象,在父子类关系中完成了很多操作

      在创建的过程中,还创建了reader对象、scanner对象和新的environment对象,将新的环境对象赋值给上下文对象和其内部的scanner和reader,还配置了条件判断器对象(conditionEvaluator)

    10. exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[] { ConfigurableApplicationContext.class }, context);
      设置异常报告器对象

    11. prepareContext(context, environment, listeners, applicationArguments, printedBanner);
      上下文的准备工作

      1. context.setEnvironment(environment);
        重新配置上下文的环境对象
      2. postProcessApplicationContext(context);
        为上下文对象的beanFactory注入了三个postprocessor对象
      3. applyInitializers(context);
        根据初始化器循环初始化上下文
      4. listeners.contextPrepared(context);
        传播上下文准备事件
      5. beanFactory.registerSingleton("springApplicationArguments", applicationArguments);
        向beanFactory注册命令行参数
      6. ((DefaultListableBeanFactory) beanFactory).setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
        设置allowBeanDefinitionOverriding为false
      7. load(context, sources.toArray(new Object[0]));
        加载很多资源配置文件,加载上下文
      8. listeners.contextLoaded(context);
        传播上下文加载事件
    12. refreshContext(context);
      刷新应用上下文

    13. afterRefresh(context, applicationArguments);
      应用上下文刷新的后置处理,做一些扩展功能

    14. _stopWatch.stop();
      计时结束

    15. if (this.logStartupInfo) {
         new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
      }
      

      输出日志记录,执行类主名、时间信息

    16. listeners.started(context);
      发布上下文启动事件

    17. listeners.running(context);
      发布应用上下文就绪事件

    18. return context;
      返回应用上下文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值