一文帶你了解SpringBoot的啟動原理
Spring Boot 的啟動原理可以概括為以下幾個步驟:
- 加載 Spring Boot 應(yīng)用程序的啟動類
- 根據(jù)啟動類所在的包路徑掃描相關(guān)的類
- 根據(jù)掃描到的類自動配置 Spring 應(yīng)用程序
- 啟動嵌入式的 Web 服務(wù)器
- 運行 Spring 應(yīng)用程序
Spring Boot 啟動過程的源碼剖析:
@SpringBootApplication // 標記該類為 Spring Boot 應(yīng)用程序的啟動類
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args); // 執(zhí)行 Spring Boot 應(yīng)用程序
}
}
在 Spring Boot 應(yīng)用程序的啟動類中,需要使用 @SpringBootApplication 注解標記該類,以告訴 Spring Boot 這是應(yīng)用程序的啟動類。@SpringBootApplication 注解包含了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 這三個注解,分別表示該類是配置類、開啟自動配置和掃描組件。
在 main 方法中,調(diào)用 SpringApplication.run 方法來啟動 Spring Boot 應(yīng)用程序。該方法接受兩個參數(shù),第一個參數(shù)是啟動類的類對象,第二個參數(shù)是主方法的參數(shù)。在 SpringApplication.run 方法中,會執(zhí)行以下幾個步驟:
- 創(chuàng)建一個 SpringApplication 對象,該對象包含了所有的 Spring Boot 應(yīng)用程序配置信息。
- 根據(jù) SpringApplication 對象中的配置信息,創(chuàng)建一個 ApplicationContext 對象,該對象是 Spring 應(yīng)用程序的上下文。
- 將所有的 @Configuration 類型的類注冊到 ApplicationContext 對象中。
- 根據(jù) @EnableAutoConfiguration 注解,自動配置 Spring 應(yīng)用程序。
- 掃描所有的 @Component 注解的類,并將其注冊到 ApplicationContext 中。
- 啟動嵌入式的 Web 服務(wù)器。
- 運行 Spring 應(yīng)用程序。
下面是 SpringApplication.run 方法的源碼注釋:
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
return run(new Class<?>[] { primarySource }, args);
}
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
// 創(chuàng)建 SpringApplication 對象,包含了所有的 Spring Boot 應(yīng)用程序配置信息
SpringApplication application = new SpringApplication(primarySources);
// 運行 Spring Boot 應(yīng)用程序,并返回上下文對象
return application.run(args);
}
public ConfigurableApplicationContext run(String... args) {
// 創(chuàng)建并啟動 ConfigurableApplicationContext 對象,返回該對象
ConfigurableApplicationContext context = createApplicationContext();
// 執(zhí)行 Spring 應(yīng)用程序的監(jiān)聽器
listeners.starting(this.applicationArguments);
try {
// 準備 ApplicationContext 環(huán)境
prepareEnvironment(context, this.environment);
// 配置 ApplicationContext
configureIgnoreBeanInfo(context);
// 執(zhí)行所有的 ApplicationContextInitializer
applyInitializers(context);
// 執(zhí)行所有的 SpringApplicationRunListener 的 starting 方法
listeners.contextPrepared(context);
// 打印 Spring Boot 應(yīng)用程序的 Banner
Banner printedBanner = printBanner();
// 創(chuàng)建 ApplicationContext
context.refresh();
// 將 ApplicationContext 注冊到 JVM 關(guān)閉鉤子中
prepareContext(context, printedBanner);
// 執(zhí)行所有的 ApplicationContextInitializer 的 postProcessApplicationContext 方法
postProcessApplicationContext(context);
// 執(zhí)行所有的 SpringApplicationRunListener 的 contextLoaded 方法
listeners.contextLoaded(context);
}
catch (Throwable ex) {
handleRunFailure(context, ex, listeners);
throw new IllegalStateException(ex);
}
try {
// 執(zhí)行所有的 SpringApplicationRunListener 的 started 方法
listeners.started(context);
// 啟動嵌入式的 Web 服務(wù)器
callRunners(context, this.applicationArguments);
}
catch (Throwable ex) {
handleRunFailure(context, ex, listeners);
throw new IllegalStateException(ex);
}
try {
// 執(zhí)行所有的 SpringApplicationRunListener 的 running 方法
listeners.running(context);
}
catch (Throwable ex) {
handleRunFailure(context, ex, listeners);
throw new IllegalStateException(ex);
}
return context;
}
在 SpringApplication.run 方法中,還會調(diào)用一些其他的方法,如 prepareEnvironment、applyInitializers、postProcessApplicationContext、callRunners 等,這些方法是 Spring Boot 應(yīng)用程序啟動的關(guān)鍵步驟,它們會對應(yīng)用程序進行配置、初始化、啟動等操作。
以上就是一文帶你了解SpringBoot的啟動原理的詳細內(nèi)容,更多關(guān)于SpringBoot啟動原理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java?web訪問http://localhost:8080/xx/xx.jsp報404錯誤問題的解決方法
這篇文章主要給大家介紹了關(guān)于Java?web訪問http://localhost:8080/xx/xx.jsp報404錯誤問題的解決方法,很多小伙伴在剛開始用Springboot整合jsp開發(fā)時都會遇到這個問題, 按照別人的教程一步一步搭建,但就是會報404,文中介紹的非常詳細,需要的朋友可以參考下2023-04-04
Spring Boot應(yīng)用事件監(jiān)聽示例詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot應(yīng)用事件監(jiān)聽的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-12-12
eclipse下整合springboot和mybatis的方法步驟
這篇文章主要介紹了eclipse下整合springboot和mybatis的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03
一文了解Java讀寫鎖ReentrantReadWriteLock的使用
ReentrantReadWriteLock稱為讀寫鎖,它提供一個讀鎖,支持多個線程共享同一把鎖。這篇文章主要講解一下ReentrantReadWriteLock的使用和應(yīng)用場景,感興趣的可以了解一下2022-10-10
springboot prototype設(shè)置多例不起作用的解決操作
這篇文章主要介紹了springboot prototype設(shè)置多例不起作用的解決操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Java并發(fā)編程必備之Synchronized關(guān)鍵字深入解析
本文我們深入探索了Java中的Synchronized關(guān)鍵字,包括其互斥性和可重入性的特性,文章詳細介紹了Synchronized的三種使用方式:修飾代碼塊、修飾普通方法和修飾靜態(tài)方法,感興趣的朋友一起看看吧2025-04-04
詳談Java中instanceof和isInstance的區(qū)別
下面小編就為大家?guī)硪黄斦凧ava中instanceof和isInstance的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01

