spring-boot-2.0.3不一样系列之源码篇——阶段总结

  

前言
开心一刻

  

朋友喜欢去×××,第一次推门进来的是一个学生美眉,感觉还不错,后来经常去,有时是护士,有时是空姐,有时候是教师。昨天晚上推门进去的是一个女警察,长得贼好,看身材也很好,朋友嗷的一声就扑上去了。然后他就被抓起来了,罪名是:×××,袭警,强奸未遂。

  

路漫漫其修远兮,吾将上下而求索!

  

github: https://github.com/youzhibing

  

码云(gitee): https://gitee.com/youzhibing

  

回到顶部
前情回顾
springboot2.3源码篇之SpringApplication的构造方法

  

主要做了两件事:

  

1,推测应用类型

  

根据类路径下是否存在指定类型的类来断定应用类型;

  

应用类型有三种:没有,SERVLET,活泼,禁忌表示普通的java应用,SERVLET表示基于SERVLET的web工程,无功表示反应性web应用程序(还没去了解,囧…)

  

2,获取ApplicationContextInitializer, ApplicationListener实例

  

查找类路径下全部的meta - inf/spring.factories的URL (spring.factories文件的路径),并加载所有春天。工厂中的内容(包括各种初始化器,ApplicationListener, AutoConfigure,故障分析仪等)到SpringFactoriesLoader的缓存中;

  

然后从缓存中获取ApplicationContextInitializer, ApplicationListener类型的类并进行实例化,然后将得到的实例化集合分别赋值给SpringApplication的初始化和听众

  

springboot2.3源码篇之运行方法(一):SpringApplicationRunListener

  

主要做了两件事:

  

1,准备好运行时监听器:EventPublishingRunListener,并过滤出于与ApplicationStartingEvent匹配的监听器

  

2,广播ApplicationStartingEvent事件、触发对应的事件监听器

  

LoggingApplicationListener   

检测正在使用的日志系统

  

BackgroundPreinitializer   

另起一个后台线程执行耗时的初始化

  

springboot2.3源码篇之运行方法(二):prepareEnvironment方法

  

1,获取或创建环境

  

根据SpringApplication构造方法中推断出的应用类型创建对应的环境,一般而言是网络环境:StandardServletEnvironment

  

2,广播ApplicationEnvironmentPreparedEvent事件、触发相应的监听器

  

ConfigFileApplicationListener   

添加名叫随机的RandomValuePropertySource到环境

  

添加名叫applicationConfig:[类路径:/application.yml]的OriginTrackedMapPropertySource到环境

  

LoggingApplicationListener   

初始化日志系统

  

3,加载外部化配置的资源到环境

  

包括命令行参数,servletConfigInitParams, servletContextInitParams, systemProperties, sytemEnvironment,随机的,application.yml (.yaml/xml/. properties)等

  

springboot2.3源码篇之运行方法(三):createApplicationContext方法

  

1,实例化应用上下文

  

应用类型有三种,对应的上下文也有三种,没有→所,SERVLET→AnnotationConfigServletWebServerApplicationContext、活性→AnnotationConfigReactiveWebServerApplicationContext;一般而言,创建的是AnnotationConfigServletWebServerApplicationContext。

  

2,实例化AnnotatedBeanDefinitionReader, ClassPathBeanDefinitionScanner和DefaultListableBeanFactory

  

AnnotatedBeanDefinitionReader是注解豆定义读取器,用于编程式注解bean的注册;ClassPathBeanDefinitionScanner是类路径豆定义扫描器,用于检测类路径上的豆候选者。

  

AnnotatedBeanDefinitionReade用来加载类类型的配置,在它初始化的时候,会预先注册一些BeanPostProcessor和BeanFactoryPostProcessor,这些处理器会在接下来的春天初始化流程中被调用.ClassPathBeanDefinitionScanner是一个扫描指定类路径中注解豆定义的扫描器,在它初始化的时候,会初始化一些需要被扫描的注解。

  

DefaultListableBeanFactory,也就是我们所说的beanFactory,用来注册所有豆定义(bean定义),也可以用来作为单例bean工厂。

  

springboot2.3源码篇之运行方法(四):prepareContext方法

  

1,将SpringApplication中的部分属性应用到上下文中

  

SpringApplication中的环境中,初始化,听者应用到弹簧上下文中

  

2,广播ApplicationPreparedEvent事件、触发对应的事件监听器

  

向上下文的beanfactorypostprocessor中注册了一个PropertySourceOrderingPostProcessor实例
向beanFactory中注册了一个名叫springBootLoggingSystem的单例bean,也就是我们的日志系统bean

  

3,加载资源

  

支持4种方式:类、资源、包和CharSequence进行。

  

类:注解形式的Bean定义;AnnotatedBeanDefinitionReader负责处理。

spring-boot-2.0.3不一样系列之源码篇——阶段总结