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

