前言
SpringBoot 是一个让所有 Java 开发者都又爱又恨的框架。
喜欢它是因为其易用性和提供的丰富功能,而它较为复杂的设计也让许多开发者头疼不已。
本期『知行』将会为大家带来以下内容,和大家一起梳理 SpringBoot 中一些较为核心的内容。
SpringBoot 启动流程
SpringBoot 的启动流程主要有以下几个核心步骤:
NO. | 步骤 | 说明 |
---|---|---|
1 | 创建启动容器 | 创建 DefaultBootstrapContext ,用于引导 IOC 容器启动。 |
2 | 启动监听器 | 监听应用启动时发生的相关事件。 |
3 | 准备应用环境 | 配置应用所需的环境。 |
4 | 创建应用上下文 | 创建核心 IOC 容器。 |
5 | 准备应用上下文 | 加载 BeanDefinition 。 |
6 | 刷新应用上下文 | 创建 Bean 。 |
7 | 调用 Runner | 执行用户自定义的 ApplicationRunner / CommandLineRunner ,用于扩展。 |
SpringBoot 生命周期
SpringBoot 生命周期的每个阶段都会发布相应的事件:
NO. | 事件名称 | 说明 |
---|---|---|
1 | starting(启动) | 发布 ApplicationStartingEvent 事件 |
2 | environmentPrepared(环境准备完成) | 发布 ApplicationEnvironmentPreparedEvent 事件 |
3 | contextPrepared(上下文准备完成) | 发布 ApplicationContextInitializedEvent 事件 |
4 | contextLoad(上下文加载) | 发布 ApplicationPreparedEvent 事件 |
5 | started(启动完成) | 发布 ApplicationStartedEvent 事件 |
6 | ready(就绪) | 发布 ApplicationReadyEvent 事件 |
在 SpringBoot 3.0.0 前,ready 阶段是 running,现在 running 已被废弃。
如果 SpringBoot 生命周期的正常阶段发生异常,会进入失败阶段并发布 ApplicationFailedEvent 事件。
Bean 生产过程
Bean 的生产大致有 4 个核心步骤:
- BeanDefinitionLoader 加载 XML 文件或注解中定义的内容;
- BeanDefinitionLoader 将加载的内容转换成 BeanDefinition;
- BeanDefinitionRegistry 将 BeanDefinition 注册到 BeanFactory 中;
- BeanFactory 负责将 BeanDefinition 生成 Bean;
BeanDefinitionLoader
BeanDefinitionLoader 依靠以下几个类完成加载并解析 BeanDefinition:
- AnnotatedBeanDefinitionReader:负责解析注解;
- AbstractBeanDefinitionReader:负责解析 XML 文件;
- BeanDefinitionReader:负责解析 Groovy 文件;
- ClassPathBeanDefinitionScanner:扫描指定类路径;
Bean 生命周期
Bean 生命周期的 5 个阶段:
- 实例化阶段:实例化 Bean;
- 填充属性阶段(可能发生循环依赖):对 Bean 的实例化对象进行属性填充;
- 初始化阶段(核心操作):负责初始化 Bean,执行一些预定义的方法;
- 使用阶段:开发者使用;
- 销毁阶段:执行一些预定义的销毁方法;
Bean 与循环依赖
在 Spring 中,若创建 Bean 发生解决循环依赖会通过三级缓存解决。
singletonObjects
(一级缓存):存放 完整 的 Bean 对象;earlysingletonObjects
(二级缓存):存放 Bean 的 早期(early)对象;singletonFactories
(三级缓存):存放 Bean 的 工厂(Factory)对象;
知行有话
本期的分享到此结束啦!如果大家认为 SpringBoot 中还有哪些比较核心的知识点没有提及到,欢迎在评论区留言哦~