最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot的運(yùn)行機(jī)制詳細(xì)解讀

 更新時(shí)間:2025年12月19日 14:42:49   作者:杰西筆記  
SpringBoot是Spring框架的封裝與增強(qiáng),通過(guò)自動(dòng)配置和內(nèi)嵌服務(wù)器簡(jiǎn)化了JavaWeb開(kāi)發(fā),從宏觀架構(gòu)、啟動(dòng)流程、核心原理三個(gè)層面深入解析,強(qiáng)調(diào)了控制反轉(zhuǎn)、自動(dòng)配置和Starter機(jī)制,通過(guò)若依項(xiàng)目實(shí)例展示了如何在實(shí)際應(yīng)用中使用SpringBoot,感興趣的朋友跟隨小編一起看看吧

理解 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 等
  • Starterspring-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-webWeb 開(kāi)發(fā)(含 Tomcat + Spring MVC)
mybatis-spring-boot-starterMyBatis 集成
spring-boot-starter-data-redisRedis 支持

?? 引入 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

  1. 請(qǐng)求被 Tomcat 接收
  2. DispatcherServlet 路由到 SysUserController.list()
  3. 調(diào)用 SysUserService.selectUserList()
  4. SysUserMapper.selectUserList() 執(zhí)行 SQL
  5. 返回 JSON 數(shù)據(jù)

? 全程由 Spring Boot 自動(dòng)串聯(lián),你只需關(guān)注業(yè)務(wù)邏輯。

五、可視化:Spring Boot 啟動(dòng)流程圖

main() SpringApplication ApplicationContext Tomcat DispatcherServlet run() create & refresh() scan components load auto-configurations create beans (IoC) start embedded server register DispatcherServlet ready! Wait for HTTP requests... main() SpringApplication ApplicationContext Tomcat DispatcherServlet

六、常見(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í)建議

  1. 先會(huì)用:寫 Controller、Service、Mapper,跑通 CRUD
  2. 再理解:看啟動(dòng)日志,了解自動(dòng)配置過(guò)程
  3. 最后深入:閱讀 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)增刪查改

    本文主要介紹了SpringBoot配置MyBatis-Plus實(shí)現(xiàn)增刪查改,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Java陷阱之a(chǎn)ssert關(guān)鍵字詳解

    Java陷阱之a(chǎn)ssert關(guān)鍵字詳解

    這篇文章詳細(xì)介紹了Java陷阱之a(chǎn)ssert關(guān)鍵字,有需要的朋友可以參考一下
    2013-09-09
  • Java中重寫和重載的區(qū)別及說(shuō)明

    Java中重寫和重載的區(qū)別及說(shuō)明

    Java語(yǔ)言中的重載和重寫是實(shí)現(xiàn)多態(tài)的兩種方式,但他們的實(shí)現(xiàn)方式和規(guī)則有所不同,重載發(fā)生在一個(gè)類中,同名的方法如果有不同的參數(shù)列表,則視為重載,重寫則發(fā)生在子類和父類之間,要求子類重寫方法和父類被重寫方法有相同的返回類型
    2024-10-10
  • Spring Security如何基于Authentication獲取用戶信息

    Spring Security如何基于Authentication獲取用戶信息

    這篇文章主要介紹了Spring Security如何基于Authentication獲取用戶信息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java基礎(chǔ)之引用相關(guān)知識(shí)總結(jié)

    Java基礎(chǔ)之引用相關(guān)知識(shí)總結(jié)

    今天聊聊Java的引用,大多數(shù)時(shí)候我們說(shuō)引用都是強(qiáng)引用,只有在對(duì)象不使用的情況下才會(huì)釋放內(nèi)存,其實(shí)Java 內(nèi)存有四種不同的引用.一起看看吧,,需要的朋友可以參考下
    2021-05-05
  • 解決SpringBoot整合RocketMQ遇到的坑

    解決SpringBoot整合RocketMQ遇到的坑

    這篇文章主要介紹了解決SpringBoot整合RocketMQ遇到的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java的Lambda表達(dá)式使用及說(shuō)明

    Java的Lambda表達(dá)式使用及說(shuō)明

    文章介紹了JavaSE8中的Lambda表達(dá)式,其基本語(yǔ)法、函數(shù)接口的概念以及在集合中的使用,同時(shí),還討論了Lambda表達(dá)式的變量捕獲和一些優(yōu)點(diǎn)與缺點(diǎn)
    2026-02-02
  • SpringBoot?實(shí)現(xiàn)CAS?Server統(tǒng)一登錄認(rèn)證的詳細(xì)步驟

    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類使用小結(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)

    本文主要介紹了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

最新評(píng)論

水富县| 清远市| 宜丰县| 龙井市| 荔浦县| 加查县| 大荔县| 正阳县| 罗甸县| 博乐市| 鄂托克旗| 广宁县| 涟源市| 井冈山市| 阜南县| 芜湖市| 专栏| 衡阳县| 北碚区| 临沂市| 南靖县| 新和县| 广德县| 阳江市| 眉山市| 馆陶县| 清水河县| 大新县| 蓬莱市| 晴隆县| 高阳县| 长兴县| 当阳市| 绿春县| 南开区| 剑川县| 钟祥市| 巴林右旗| 玛纳斯县| 揭阳市| 历史|