SpringBoot启动流程(2) | 七日打卡

696 阅读2分钟

前言

  上一章讲到了项目启动之后,整个环境的创建以及事件监听的启动-SpringBoot启动流程(1) | 七日打卡。接下来就到了Context部分了,

流程讲解

  今天的打卡讲解其中一部分(也算是整个环境搭建的重点)-开搞

代码部分:

context = createApplicationContext();
exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,new Class[] { ConfigurableApplicationContext.class }, context);
prepareContext(context, environment, listeners, applicationArguments, printedBanner);

流程一

首先根据上文的webApplicationType类型,利用反射创建出对应的上下文(这里即是AnnotationConfigServletWebServerApplicationContext)。

流程二

从当前类加载器中获取SpringBootExceptionReporter类型的Bean。该Bean是用户自定义异常处理回调接口。

流程三

  1. 设置环境(environment)至(context)中。
  2. 将相关的后处理设置入context中,例如转化器实例,Bean名称生成器等等。
  3. 通过Initializers集合操作(context)添加后处理器以及Initializer操作等。
  4. 注册DefaultApplicationArguments对象至BeanFactory中。
  5. 注册SpringBootBanner对象至BeanFactory中。
  6. 设置allowBeanDefinitionOverriding值。
  7. 构建BeanDefinitionLoader
    1. 构建AnnotatedBeanDefinitionReader实例。
    2. 构建XmlBeanDefinitionReader实例。
    3. 构建ClassPathBeanDefinitionScanner实例。
    4. registerDefaultFilters

      这里包括 includeFilters添加成员:
      1.Component注解
      2.javax.annotation.ManagedBean注解-JSR-250
      3.javax.inject.Named注解-JSR-330

    5. setEnvironment以及conditionEvaluator=null
    6. 构建ConditionEvaluator实例(Conditional annotation)。
    7. 判断所需要的bean后处理器是否存在registry中。
  8. 调用BeanDefinitionLoaderload()
    1. 构建·StandardAnnotationMetadata`(含有启动类上所有注解信息)。
    2. 判断是否含有Conditional
    3. 设置单例还是多例(默认单例)。
    4. 判断Lazy属性,Primary属性,DependsOn属性,Role属性,Description属性。
    5. 创建BeanDefinitionHolder
    6. 判断是否要进行beanScopedProxyMode
    7. 注册DefinitionHolder
  9. context.addApplicationListener(listener)PropertySourceOrderingPostProcessor注册springBootLoggingSystem)。

流程完结

上述的代码主要是将整个Bean的环境准备好,为下面解析Bean以及创建出来做出准备。下面一节将会讲解到。