SpringBoot-启动流程

Run方法做了哪些事情?

我们重点关注红框中的内容:

  • BootstrapContext 是一个简单的引导上下文,它在启动期间以及环境后处理过程中可用,直到应用上下文 ApplicationContext 准备就绪。
    它提供了对可能创建成本高昂的单例的延迟访问,或者在 ApplicationContext 可用之前需要共享的单例。
  • ConfigurableEnvironment准备环境,可以看到有两种,一种是SERVLET一种是REACTIVE
  • 创建ConfigurableApplicationContext

    这里做的事情,一个是超类创建了DefaultListableBeanFactory:

    而是实例化了两个Reader,一个是基于注解驱动的Bean读取,一个是基于xml文件的Bean读取:

我们平时使用注解驱动比较多,我们来看看看这个AnnotatedBeanDefinitionReader做了什么事情?

很清晰的可以看到调用了AnnotationConfigUtils中的一个方法,这里注册了一下PostProcessor其中ConfigurationClassPostProcessor非常的重要,它实现了BeanFactoryPostProcessor,这个是做配置类@Configuration Bean导入的,其中是通过ConfigratonParser 把每个Configration 类加载并放到configurationClasses缓存中:

同时这个parse类也负责一些注解的Bean加载,这里逻辑很长都在doProcessConfigurationClass方法里面:

好了这些重点逻辑看完了,下面就是我们比较熟悉的Spirng Context刷新了。

Context 刷新与Run 启动以后的关联

我们通过上面的分析知道,Run方法里面给我们准备好了Environment,Context,下面就是进行Context的刷新了,我们重点关注BeanFactoryPostProcessor 因为前文我们提到很重要的一个工作就是注册了ConfigurationClassPostProcessor:

我们可以很清晰的看到在这里执行了真正的调用,这样一来,我们的BeanDefinition就会被加载。

相关推荐
Tisfy3 分钟前
LeetCode 1979.找出数组的最大公约数:模拟(附手动gcd)
java·数学·算法·leetcode·题解·最大公约数
糖果店的幽灵6 分钟前
【langgraph 从入门到精通graphApi 篇】节点与边 —— 图的骨架
java·数据库·人工智能·redis·langgraph
CHANG_THE_WORLD11 分钟前
7.C++标准多线程实现 TCP通信
java·c++·tcp/ip
chen_ke_hao13 分钟前
K8s 高可用集群部署
java·docker·kubernetes
fengxinzi_zack15 分钟前
年统计与最长连续天数:数据聚合可视化
后端
全堆鸿蒙17 分钟前
aboutToAppear 生命周期:路由参数获取与数据初始化
后端
2501_9318037522 分钟前
Go 反射:原理、核心机制与实践指南
开发语言·后端·golang
CodeStats25 分钟前
《源纹天书》第一百八十一章至第一百八十五章:跨界bug·双世界联合debug
java·源纹天书
小则又沐风a27 分钟前
库的原理:目标文件,ELF格式,程序加载
java·linux·前端
程序员爱钓鱼34 分钟前
Rust if let 与 while let 详解:简化模式匹配
前端·后端·rust