springboot的運行機制詳細解讀
理解 Spring Boot 的運行機制,是掌握現(xiàn)代 Java Web 開發(fā)的關(guān)鍵。我們可以從 宏觀架構(gòu) + 啟動流程 + 核心原理 三個層面來系統(tǒng)性地拆解。
?? 一句話總結(jié)
Spring Boot = Spring 框架 + 自動配置(AutoConfiguration)+ 內(nèi)嵌服務(wù)器(如 Tomcat) + 約定優(yōu)于配置(Convention over Configuration)
它讓你 不用寫 XML、不用配 web.xml、不用手動部署 WAR 包,直接 main() 方法啟動一個完整的 Web 應(yīng)用。
一、宏觀視角:Spring Boot 是如何工作的?
?? 整體架構(gòu)圖(簡化版)
graph LR
A[你的代碼] --> B(Spring Boot Starter)
B --> C[Spring Framework]
C --> D[內(nèi)嵌 Tomcat/Jetty]
D --> E[HTTP 請求/響應(yīng)]
F[application.yml] --> C
G[@SpringBootApplication] --> C- 你的代碼:Controller、Service、Mapper 等
- Starter:
spring-boot-starter-web、mybatis-spring-boot-starter等,自動引入依賴和配置 - Spring Framework:核心容器(IoC、AOP)、事務(wù)、Web MVC 等
- 內(nèi)嵌服務(wù)器:無需外部 Tomcat,直接運行 JAR 包
- 配置文件:
application.yml控制行為
二、啟動流程詳解(從 main() 到接收請求)
?? 步驟 1:執(zhí)行main()方法
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args); // ← 關(guān)鍵入口
}
}
這不是普通程序入口,而是 啟動 Spring 容器的命令。
?? 步驟 2:創(chuàng)建SpringApplication實例
SpringApplication.run() 內(nèi)部會:
- 推斷應(yīng)用類型(SERVLET / REACTIVE)
- 設(shè)置初始化器(Initializers)
- 設(shè)置監(jiān)聽器(Listeners)
- 推斷主配置類(即帶
@SpringBootApplication的類)
?? 步驟 3:刷新 Spring 應(yīng)用上下文(refresh context)
這是最核心的一步,包含以下子過程:
? 3.1 掃描組件(Component Scan)
- 從
@SpringBootApplication所在包開始遞歸掃描 - 發(fā)現(xiàn)
@Component,@Service,@Controller,@Repository等注解的類 - 將它們注冊為 BeanDefinition(Bean 的“藍圖”)
? 3.2 加載自動配置(AutoConfiguration)
- 讀取
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports - 根據(jù) classpath 中的依賴(如存在
tomcat-embed-core.jar),自動啟用TomcatServletWebServerFactory - 條件裝配:只有滿足條件才生效(如
@ConditionalOnClass(DataSource.class))
?? 這就是為什么你只加
mybatis-spring-boot-starter,MyBatis 就能自動工作!
? 3.3 創(chuàng)建 Bean 實例(IoC 容器初始化)
- 遍歷所有 BeanDefinition
- 通過反射調(diào)用構(gòu)造函數(shù) →
new XxxService() - 執(zhí)行依賴注入(
@Autowired) - 調(diào)用初始化方法(
@PostConstruct)
? 3.4 啟動內(nèi)嵌 Web 服務(wù)器
- 如果是 Web 應(yīng)用,會創(chuàng)建 Tomcat 實例
- 注冊 DispatcherServlet(Spring MVC 的核心)
- 綁定端口(默認 8080)
? 3.5 觸發(fā)啟動完成事件
- 調(diào)用
CommandLineRunner/ApplicationRunner - 日志輸出:
Started Application in X.XXX seconds
?? 步驟 4:等待并處理 HTTP 請求
當用戶訪問 http://localhost:8080/api/user:
瀏覽器 → ↓ 內(nèi)嵌 Tomcat 接收請求 → ↓ DispatcherServlet(前端控制器) → ↓ HandlerMapping 找到匹配的 @Controller → ↓ 調(diào)用對應(yīng)方法(如 getUser()) → ↓ 返回結(jié)果(JSON / 頁面) → ↓ Tomcat 返回響應(yīng)給瀏覽器
? 整個過程由 Spring MVC 驅(qū)動,而 Spring MVC 是 Spring Framework 的一部分。
三、核心機制解析
1??控制反轉(zhuǎn)(IoC)與依賴注入(DI)
- IoC:對象的創(chuàng)建權(quán)交給 Spring 容器(不再是
new) - DI:容器自動把依賴的對象“注入”進來(
@Autowired)
?? 結(jié)果:代碼解耦,易于測試和維護。
2??自動配置(AutoConfiguration)
Spring Boot 通過 @EnableAutoConfiguration 實現(xiàn)“智能配置”。
例如:
- 發(fā)現(xiàn) classpath 有
HikariCP→ 自動配置數(shù)據(jù)源 - 發(fā)現(xiàn)有
spring-webmvc→ 自動配置 DispatcherServlet - 發(fā)現(xiàn)有
mybatis-spring→ 自動配置 SqlSessionFactory
? 你只需在
application.yml中寫:
spring:
datasource:
url: jdbc:mysql://...3??Starter 機制
Starter 是“一站式依賴包”,比如:
| Starter | 功能 |
|---|---|
spring-boot-starter-web | Web 開發(fā)(含 Tomcat + Spring MVC) |
mybatis-spring-boot-starter | MyBatis 集成 |
spring-boot-starter-data-redis | Redis 支持 |
?? 引入 starter 后,Spring Boot 自動完成配置,你幾乎不用寫代碼。
4??內(nèi)嵌服務(wù)器
- 默認使用 Tomcat(可切換為 Jetty 或 Undertow)
- 打包成 JAR(不是 WAR),直接
java -jar app.jar運行 - 無需安裝外部 Web 容器
四、若依(RuoYi)項目中的體現(xiàn)
你在若依項目中看到的:
@SpringBootApplication
@EnableAsync
@EnableTransactionManagement
public class RuoYiApplication {
public static void main(String[] args) {
SpringApplication.run(RuoYiApplication.class, args);
}
}
@SpringBootApplication:啟動自動配置 + 組件掃描@EnableAsync:開啟異步支持(@Async)@EnableTransactionManagement:開啟事務(wù)管理(@Transactional)
當你訪問 /system/user/list:
- 請求被 Tomcat 接收
- DispatcherServlet 路由到
SysUserController.list() - 調(diào)用
SysUserService.selectUserList() SysUserMapper.selectUserList()執(zhí)行 SQL- 返回 JSON 數(shù)據(jù)
? 全程由 Spring Boot 自動串聯(lián),你只需關(guān)注業(yè)務(wù)邏輯。
五、可視化:Spring Boot 啟動流程圖
六、常見誤區(qū)澄清
| 誤區(qū) | 正確理解 |
|---|---|
| ? “Spring Boot 是一個新框架” | ? 它是 Spring Framework 的封裝和增強 |
| ? “必須用注解,不能用 XML” | ? 仍可混合使用 XML 配置(但不推薦) |
| ? “自動配置無法定制” | ? 可通過 application.yml 覆蓋,或 @EnableAutoConfiguration(exclude=...) 禁用 |
| ? “Bean 是多例的” | ? 默認是單例(Singleton),可通過 @Scope("prototype") 改變 |
七、總結(jié):Spring Boot 的設(shè)計哲學(xué)
| 原則 | 說明 |
|---|---|
| ? 約定優(yōu)于配置 | 默認行為合理,減少配置 |
| ? 開箱即用 | 引入 starter 即可工作 |
| ? 生產(chǎn)就緒 | 內(nèi)置監(jiān)控(Actuator)、健康檢查 |
| ? 快速開發(fā) | 熱部署、簡化部署(JAR 直接運行) |
?? 學(xué)習(xí)建議
- 先會用:寫 Controller、Service、Mapper,跑通 CRUD
- 再理解:看啟動日志,了解自動配置過程
- 最后深入:閱讀
spring-boot-autoconfigure源碼,理解條件裝配
到此這篇關(guān)于springboot的運行機制解析的文章就介紹到這了,更多相關(guān)springboot運行機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot配置MyBatis-Plus實現(xiàn)增刪查改
本文主要介紹了SpringBoot配置MyBatis-Plus實現(xiàn)增刪查改,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
Java陷阱之a(chǎn)ssert關(guān)鍵字詳解
這篇文章詳細介紹了Java陷阱之a(chǎn)ssert關(guān)鍵字,有需要的朋友可以參考一下2013-09-09
Spring Security如何基于Authentication獲取用戶信息
這篇文章主要介紹了Spring Security如何基于Authentication獲取用戶信息,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03
Java基礎(chǔ)之引用相關(guān)知識總結(jié)
今天聊聊Java的引用,大多數(shù)時候我們說引用都是強引用,只有在對象不使用的情況下才會釋放內(nèi)存,其實Java 內(nèi)存有四種不同的引用.一起看看吧,,需要的朋友可以參考下2021-05-05
SpringBoot?實現(xiàn)CAS?Server統(tǒng)一登錄認證的詳細步驟
??CAS(Central?Authentication?Service)中心授權(quán)服務(wù),是一個開源項目,目的在于為Web應(yīng)用系統(tǒng)提供一種可靠的單點登錄,這篇文章主要介紹了SpringBoot?實現(xiàn)CAS?Server統(tǒng)一登錄認證,需要的朋友可以參考下2024-02-02
java線程池ThreadPoolExecutor類使用小結(jié)
這篇文章主要介紹了java線程池ThreadPoolExecutor類使用,本文主要對ThreadPoolExecutor的使用方法進行一個詳細的概述,示例代碼介紹了ThreadPoolExecutor的構(gòu)造函數(shù)的相關(guān)知識,感興趣的朋友一起看看吧2022-03-03
springboot項目使用Disruptor做內(nèi)部消息隊列的實現(xiàn)
本文主要介紹了springboot項目使用Disruptor做內(nèi)部消息隊列的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07

