SringBoot的启动原理,保姆级带你认识,让面试管对你刮目相看
一,介绍
graph TD;
A[启动类] --> B[SpringApplication.run()]
B --> C[创建SpringApplication实例]
C --> D[初始化应用上下文]
D --> E[加载应用配置]
E --> F[执行自定义初始化器]
F --> G[执行ApplicationContextInitializer的initialize方法]
G --> H[准备上下文环境]
H --> I[加载配置源(默认为application.properties)]
I --> J[解析配置源]
J --> K[将解析结果存到Environment对象中]
K --> L[执行自定义属性源加载器]
L --> M[执行SpringApplicationListeners]
M --> N[执行ApplicationStartingEvent事件监听器]
N --> O[创建应用上下文]
O --> P[注册ShutdownHook]
P --> Q[准备上下文环境]
Q --> R[执行ApplicationContextInitializer的initialize方法]
R --> S[执行SpringApplicationListeners]
S --> T[执行ApplicationEnvironmentPreparedEvent事件监听器]
T --> U[装载BeanDefinition]
U --> V[执行SpringApplicationListeners]
V --> W[执行ApplicationContextInitializedEvent事件监听器]
W --> X[刷新应用上下文]
X --> Y[执行SpringApplicationListeners]
Y --> Z[执行ApplicationStartedEvent事件监听器]
Z --> A1[执行CommandLineRunner和ApplicationRunner接口的run方法]
二详细介绍
当我们启动 Spring Boot 应用程序时,Spring Boot 会按照一定的顺序执行一系列的操作,以完成应用程序的初始化和启动。下面是 Spring Boot 启动原理的详细步骤:
-
启动类中调用
SpringApplication.run()
方法,启动 Spring Boot 应用程序。 -
创建
SpringApplication
实例,对应用程序做一些初始化工作。这包括设置应用程序的类加载器、初始化默认的异常处理器等。 -
初始化应用上下文,即创建
ApplicationContext
对象。应用上下文是 Spring 框架的核心容器,负责管理和组织 Bean 对象。通过调用SpringApplication
的createApplicationContext()
方法,根据环境配置和应用类型来创建对应的应用上下文。 -
加载应用配置,默认配置文件为
application.properties
。SpringApplication
会通过SpringApplication
的静态方法从默认位置加载配置文件,如classpath:application.properties
或者classpath:application.yml
。 -
执行自定义初始化器,即执行实现了
ApplicationContextInitializer
接口的类中的initialize()
方法。这些初始化器可以在应用上下文创建之前对其进行自定义操作,比如修改配置、添加属性源等。 -
准备上下文环境,即为
Environment
对象初始化属性源,解析配置源,并将解析结果存储到Environment
对象中。Environment
是一个抽象接口,Spring Boot 使用StandardEnvironment
来实现它。在准备上下文环境时,应用程序会加载并解析配置文件,并将解析结果存储在Environment
中。 -
执行自定义属性源加载器,即执行实现了
PropertySourceLoader
接口的类中的load()
方法。自定义属性源加载器可以用来加载额外的属性源,比如数据库、远程配置中心等。 -
执行
SpringApplicationListeners
,即执行实现了SpringApplicationListener
接口的类中的onApplicationEvent()
方法。这些监听器可以在应用程序的不同阶段进行监听和处理,比如在应用程序启动前后执行一些操作。 -
执行
ApplicationStartingEvent
事件监听器。这是一个特殊的事件,用于通知监听器应用程序即将开始启动。 -
创建应用上下文,即根据配置创建对应的
ApplicationContext
对象。Spring Boot 支持多种类型的应用上下文,如AnnotationConfigApplicationContext
、ClassPathXmlApplicationContext
等。具体的应用上下文类型由环境配置决定。 -
注册 ShutdownHook,在 JVM 关闭时回调关闭方法。这样可以确保应用程序在正常关闭之前完成必要的清理工作。
-
准备上下文环境,即为
Environment
对象初始化属性源,解析配置源,并将解析结果存储到Environment
对象中。 -
执行
ApplicationContextInitializer
的initialize()
方法。这里是再次执行自定义初始化器的机会,可以对应用程序上下文进行更多的自定义操作。 -
执行
SpringApplicationListeners
,即执行实现了SpringApplicationListener
接口的类中的onApplicationEvent()
方法。这些监听器可以对应用程序上下文进行更多的监听和处理。 -
执行
ApplicationEnvironmentPreparedEvent
事件监听器。这个事件通知监听器应用程序环境已准备好,可以进行进一步的配置。 -
装载 BeanDefinition,即将配置文件中的 bean 装载到
ApplicationContext
中。在这一步中,Spring Boot 会扫描应用程序的类路径,根据配置文件中的信息,创建对应的 BeanDefinition,并将其注册到应用上下文中。 -
执行
SpringApplicationListeners
,即执行实现了SpringApplicationListener
接口的类中的onApplicationEvent()
方法。这些监听器可以在装载 BeanDefinition 的过程中进行监听和处理。 -
执行
ApplicationContextInitializedEvent
事件监听器。这个事件通知监听器应用程序上下文已初始化完成。 -
刷新应用上下文,即完成
ApplicationContext
的初始化工作。在刷新过程中,Spring Boot 会执行一系列的生命周期回调方法,包括初始化 Bean、依赖注入、后置处理等。 -
执行
SpringApplicationListeners
,即执行实现了SpringApplicationListener
接口的类中的onApplicationEvent()
方法。这些监听器可以在应用上下文刷新过程中进行监听和处理。 -
执行
ApplicationStartedEvent
事件监听器。这个事件通知监听器应用程序已启动。 -
执行
CommandLineRunner
和ApplicationRunner
接口的run()
方法。这些接口可以在应用程序启动完成后执行一些特定的任务,比如初始化数据、启动定时任务等。
通过这些步骤,Spring Boot 将应用程序初始化并启动起来。开发人员可以根据需要进行自定义配置和扩展,以实现更加灵活和高效的应用程序。