SpringBoot的源码启动的步骤

简介: SpringBoot的源码启动的步骤

1️⃣SpringBoot源码启动的步骤

Spring Boot的启动源码可以分为以下几个阶段,每个阶段都有不同的功能:

1.1 加载配置文件阶段

读取并解析application.properties和application.yml等配置文件。

将配置信息加载到Environment对象中,以供后续使用。

1.2 创建应用上下文阶段

根据配置信息创建ApplicationContext,默认为AnnotationConfigApplicationContext或GenericApplicationContext实例。注册Bean定义,扫描注解并将其转换为相应的Bean定义。

1.3 准备阶段

配置ApplicationContext的一些属性,如相关的监听器、ResourceLoader等。

设置ApplicationContext的环境变量,包括激活的Profiles等。

执行ApplicationContextInitializer接口的initialize()方法,完成初始化操作。

1.4 刷新上下文阶段

调用ApplicationContext的refresh()方法,开始刷新上下文。

进行Bean的初始化操作,包括实例化、依赖注入、后处理等。

触发各种生命周期回调,如BeanPostProcessor等。

1.5 启动阶段

检查ApplicationContext中是否存在ApplicationRunner和CommandLineRunner接口的实现类。

如果存在,通过反射执行它们的run()方法,执行自定义的启动逻辑。

1.6 完成阶段

发布ApplicationReadyEvent事件,表示应用程序已经准备就绪。

执行ApplicationContext注册的其他回调方法或者监听器。

2️⃣启动阶段的功能

  • 1 加载配置文件阶段:读取配置文件,并将配置信息加载到Environment对象中,为后续使用做准备。
  • 2 创建应用上下文阶段:创建并配置应用的上下文,包括Bean定义的扫描和注册。
  • 3 准备阶段:配置ApplicationContext的属性和环境变量,并执行初始化操作。
  • 4 刷新上下文阶段:刷新上下文,进行Bean的初始化和生命周期回调。
  • 5 启动阶段:执行自定义的启动逻辑,如ApplicationRunner和CommandLineRunner接口的实现类。
  • 6 完成阶段:发布应用程序已经准备就绪的事件,并执行其他回调方法或监听器。

这些阶段的顺序和功能确保了Spring Boot应用程序的正确启动和准备就绪,使应用程序可以正常运行。

3️⃣源码解读

3.1 源码解读启动的详细流程

  • 加载启动类:通过Java的反射机制,加载指定的启动类(通常是带有@SpringBootApplication注解的类)。
  • 解析配置: 根据spring-boot-starter依赖中的META-INF/spring.factories文件,获取所有自动配置类的全限定名。然后根据配置文件(如application.properties和application.yml)读取配置信息,并将其加载到Environment中。
  • 创建启动类的应用上下文:使用ApplicationContextInitializer接口初始化应用上下文,并按需设置激活的Profiles、默认属性等。
  • 预准备: 执行SpringApplicationRunListeners接口的starting()方法,触发应用程序启动前的事件监听器。
  • 准备阶段:
  1. 创建BeanFactory对象。
  2. 注册ApplicationContextInitializer接口的实现类,执行其initialize()方法。
  3. 注册ApplicationListener接口的实现类,准备发布应用程序事件。
  • 刷新上下文: 执行ApplicationContext的refresh()方法,进行Bean的加载、实例化、依赖注入等操作。
  • 后置处理: 应用启动完成,执行ApplicationRunner和CommandLineRunner的扩展,可以完成一些启动后初始化工作。
  • 启动完成: 执行SpringApplicationRunListeners接口的started()方法,触发应用程序已经启动的事件监听器。
  • 运行应用程序:根据配置和自动装配机制,创建并启动Spring Boot应用程序。
  • 运行阶段: 执行SpringApplicationRunListeners接口的running()方法,触发应用程序运行中的事件监听器。
  • 应用程序失败处理: 在应用程序出现异常时,执行SpringApplicationRunListeners接口的failed()方法,触发应用程序启动失败的事件监听器。

4️⃣ 扩展接口

在以上这个过程中,有一些扩展点可以进行自定义扩展:

  • 1. ApplicationContextInitializer接口:用于在创建应用上下文之前对其进行初始化操作。
  • 2. BeanPostProcessor接口:用于在Bean实例化和初始化过程中对其进行后置处理。
  • 3. ApplicationRunner接口和CommandLineRunner接口:用于定义在应用程序已经启动后执行的任务。
  • 4. SpringApplicationRunListener接口:用于定义应用程序启动和运行期间的事件监听器,可以在应用程序的不同阶段执行自定义逻辑。

通过实现或扩展这些接口,可以在Spring Boot的启动过程中添加自定义的功能、初始化操作或者监听应用程序事件

相关文章
|
16天前
|
JSON 安全 算法
|
11天前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
1月前
|
前端开发 Java
表白墙/留言墙 —— 初级SpringBoot项目,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
文章通过一个表白墙/留言墙的初级SpringBoot项目实例,详细讲解了如何进行前后端开发,包括定义前后端交互接口、创建SpringBoot项目、编写前端页面、后端代码逻辑及实体类封装的全过程。
62 3
表白墙/留言墙 —— 初级SpringBoot项目,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
1月前
|
前端开发 Java 数据安全/隐私保护
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
文章通过一个简单的SpringBoot项目,详细介绍了前后端如何实现用户登录功能,包括前端登录页面的创建、后端登录逻辑的处理、使用session验证用户身份以及获取已登录用户信息的方法。
136 2
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
|
10天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
1月前
|
缓存 Java Spring
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
文章比较了在Servlet和Spring Boot中获取Cookie、Session和Header的方法,并提供了相应的代码实例,展示了两种方式在实际应用中的异同。
133 3
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
|
1月前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
36 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
1月前
|
存储 JSON 算法
JWT令牌基础教程 全方位带你剖析JWT令牌,在Springboot中使用JWT技术体系,完成拦截器的实现 Interceptor (后附源码)
文章介绍了JWT令牌的基础教程,包括其应用场景、组成部分、生成和校验方法,并在Springboot中使用JWT技术体系完成拦截器的实现。
53 0
JWT令牌基础教程 全方位带你剖析JWT令牌,在Springboot中使用JWT技术体系,完成拦截器的实现 Interceptor (后附源码)
|
1月前
|
Java 数据库连接 mybatis
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
该文档详细介绍了如何在Springboot Web项目中整合Mybatis,包括添加依赖、使用`@MapperScan`注解配置包扫描路径等步骤。若未使用`@MapperScan`,系统会自动扫描加了`@Mapper`注解的接口;若使用了`@MapperScan`,则按指定路径扫描。文档还深入分析了相关源码,解释了不同情况下的扫描逻辑与优先级,帮助理解Mybatis在Springboot项目中的自动配置机制。
105 0
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
|
28天前
|
机器学习/深度学习 移动开发 自然语言处理
基于人工智能技术的智能导诊系统源码,SpringBoot作为后端服务的框架,提供快速开发,自动配置和生产级特性
当身体不适却不知该挂哪个科室时,智能导诊系统应运而生。患者只需选择不适部位和症状,系统即可迅速推荐正确科室,避免排错队浪费时间。该系统基于SpringBoot、Redis、MyBatis Plus等技术架构,支持多渠道接入,具备自然语言理解和多输入方式,确保高效精准的导诊体验。无论是线上医疗平台还是大型医院,智能导诊系统均能有效优化就诊流程。