SpringBoot源码理论

new SpringApplication();
1):获取Web应用程序类型.
2):获取所有的 ApplicationContextInitializer (包括 Spring.factories).
3):获取所有的 ApplicationListener (包括 Spring.factories).
4):遍历栈信息,找到主应用程序类 mainApplicationClass.

SpringApplication.run(args);
1):获取所有的 SpringApplicationRunListener 并启动监听(包括 Spring.factories).
2):准备环境
    2.1):创建环境:StandardServletEnvironment
    2.2):发布广播 environmentPrepared 事件
    2.2.1): ConfigFileApplicationListener 监听 environmentPrepared 事件;
        获取 Spring.factories 中所有的 EnvironmentPostProcessor;
        排序后遍历执行 EnvironmentPostProcessor 的 postProcessEnvironment 方法;
        ConfigFileApplicationListener中的 postProcessEnvironment 会加载当前程序的yml/properties资源文件
    2.3):将环境绑定到SpringApplication
3):配置忽略Bean信息
4):创建程序上下文
4.1): 通过构造方法实例化上下文 AnnotationConfigServletWebServerApplicationContext 时,
    会调用父类构造方法创建BeanFactory!!!
    同时创建AnnotatedBeanDefinitionReader(注解Bean定义读取器) 和 ClassPathBeanDefinitionScanner(Bean定义扫描器);
    AnnotatedBeanDefinitionReader 会注册五个后置处理器:
      ①:ConfigurationClassPostProcessor
      ②:AutowiredAnnotationBeanPostProcessor
      ③:CommonAnnotationBeanPostProcessor
      ④:EventListenerMethodProcessor
      ⑤:DefaultEventListenerFactory
    ClassPathBeanDefinitionScanner 中添加@Component 注解过滤器,设置java运行Environment 和 ResourceLoader
5):获取所有的SpringBoot异常报告器(包括 Spring.factories).
6):准备上下文
    6.1):将 StandardServletEnvironment 设置给上下文
    6.2):获取 Spring.factories 中所有的 ApplicationContextInitializer,遍历执行initialize 方法;
    6.3):发布广播 contextPrepared 上下文初始化完成事件
    6.4):如果SpringApplication设置了 lazyInitialization 则添加延迟初始化BeanFactoryPostProcessor
    6.5):加载主应用程序类 mainApplicationClass.
    6.6):发布广播 contextLoaded 上下文加载完成事件,
      获取所有的 ApplicationListener 遍历判断是否需要注入ApplicationContextAware;
      将所有的 ApplicationListener 添加到上下文;
      添加一个BeanFactoryPostProcessor: PropertySourceOrderingPostProcessor
7):刷新上下文
    7.1:准备刷新上下文
    7.2:刷新内部BeanFactory,CAS设置refreshed为true 并设置 SerializationId
    7.3:准备BeanFactory
          设置BeanFactory的类加载器,bean表达式解释器,忽略给定接口的自动装配功能
          注册ApplicationContextAwareProcessor(注入 applicationContext上下文,资源,系统参数等)
          ApplicationListenerDetector(检测容器中的ApplicationLisenter,将其注册到上下文)
    7.4:遍历执行所有的 BeanDefinitionRegistryPostProcessors 的 postProcessBeanDefinitionRegistry,按 PriorityOrdered -> Ordered -> NonOrdered 顺序执行, 其中最最重要的当属内置的 ConfigurationClassPostProcessor
            ConfigurationClassPostProcessor 中解析所有 @Configuration配置类(@PropertySource、@ComponentScan(扫描@Component)、@Import、@Bean注解) 并加载到 BeanDefinitionMap中
            ...执行其他BeanDefinitionRegistryPostProcessor
        遍历执行所有的 BeanFactoryPostProcessor 的 postProcessBeanFactory,按 PriorityOrdered -> Ordered -> NonOrdered 顺序执行
            ConfigurationClassPostProcessor 中将上面解析出来的 BeanDefinition 中加了@Configuration注解的配置类进行Cglib代理, 并给代理类添加 BeanFactory 属性 
        ...BeanFactoryPostProcessor
    7.5:注册BeanPostProcessor后置处理器
            在BeanFactory 容器中取出所有的 BeanPostProcessor,按 PriorityOrdered -> Ordered -> NonOrdered 顺序注册
            ConfigurationClassPostProcessor中已经将所有解析到的类加载到 BeanFactory 中了
            再次注册 ApplicationListenerDetector (检测容器中的 ApplicationLisenter 并注册)
    7.6:初始化消息资源解析器
    7.7:初始化程序事件委托器
    7.8:注册事件监听器:将所有 ApplicationListener 加入事件委托器
    7.9:实例化所有(非延迟初始化)单例
        遍历所有 beanDefinitionName 创建实例。
            检查缓存 singletonObjects、earlySingletonObjects 是否存在该实例,存在则获取返回,不存在则向下执行
            检查 scope, 如果是Prototype也存在循环依赖,则直接抛异常。
            检查是否能在 父级容器 获取Bean,如果找不到则委托当前容器的父级容器去查找,如果还是找不到则沿着容器的继承体系向父级容器查找(双亲委派机制),找到则直接返回,不存在则开始创建
            SmartInstantiationAwareBeanPostProcessor-predictBeanType:确定给定bean的类型。
            SmartInstantiationAwareBeanPostProcessor-getEarlyBeanReference:提前暴露的bean的引用,用来支持单例对象的循环引用。
            InstantiationAwareBeanPostProcessor-postProcessBeforeInstantiation:bean实例化之前回调,如果有返回实例则直接跳转到postProcessAfterInitialization方法。
            SmartInstantiationAwareBeanPostProcessor-determineCandidateConstructors:确定给定bean的候选构造函数。
            createBeanInstance:创建 Bean 实例
            加入 singletonFactories、registeredSingletons 缓存
	      MergedBeanDefinitionPostProcessor-postProcessMergedBeanDefinition:对指定bean的给定合并bean定义进行后处理。
            InstantiationAwareBeanPostProcessor-postProcessAfterInstantiation:bean实例化之后回调。
            InstantiationAwareBeanPostProcessor-postProcessProperties:将属性值应用于bean之前回调。
            BeanPostProcessor-postProcessBeforeInitialization:bean初始化之前回调。
            InitializingBean-afterPropertiesSet:自定义初始化方法。
            xml中配置的init-method:xml指定的自定义初始化方法。
            BeanPostProcessor-postProcessAfterInitialization:bean初始化之后回调。
            加入 singletonObjects、registeredSingletons 缓存
        检查循环依赖
        检查创建的Bean实例对象类型
    7.10:清空上下文资源缓存
         初始化 上下文生命周期processor
         发布广播 ContextRefreshedEvent 容器刷新完成事件
8):发布广播 ApplicationStartedEvent 事件( SpringApplicationRunListeners 监听事件并处理)
9):遍历处理所有 ApplicationRunner、CommandLineRunner
10):发布广播 ApplicationReadyEvent 事件( SpringApplicationRunListeners 监听事件并处理)

  

posted @ 2020-12-10 18:23  柒月丶  阅读(148)  评论(0)    收藏  举报