spring boot 詳解以及原理

Spring Boot 是 Spring 框架的擴展,旨在簡化 Spring 應用的開發和部署。它通過自動配置約定優于配置的原則,讓開發者能夠快速搭建獨立運行的、生產級別的 Spring 應用。以下是 Spring Boot 的詳細解析和工作原理:

一、Spring Boot 的核心特性

  1. 自動配置

    • 根據項目依賴和配置,自動配置 Spring 框架的組件(如數據源、Web 服務器等)。
    • 例如,添加?spring-boot-starter-web?依賴后,會自動配置嵌入式 Tomcat 服務器和 Spring MVC。
  2. 起步依賴(Starters)

    • 提供 “一站式” 依賴管理,將常用的依賴組合在一起。
    • 例如:
      • spring-boot-starter-web:Web 應用開發(含 Spring MVC、Tomcat)。
      • spring-boot-starter-data-jpa:JPA 數據庫訪問。
      • spring-boot-starter-test:測試工具(含 JUnit、Mockito)。
  3. 嵌入式服務器

    • 支持嵌入式 Tomcat、Jetty 或 Undertow,無需部署 WAR 文件,直接運行 JAR。
  4. 生產級特性

    • 提供健康檢查(Actuator)、指標監控、外部化配置等功能。
  5. 無代碼生成和 XML 配置

    • 通過注解(如?@SpringBootApplication)和約定(如目錄結構)減少樣板代碼。

二、Spring Boot 的工作原理

1. 核心注解:@SpringBootApplication

java

@SpringBootApplication
public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args);}
}

  • @SpringBootApplication?是一個組合注解,包含:
    • @SpringBootConfiguration:等同于?@Configuration,聲明配置類。
    • @EnableAutoConfiguration:開啟自動配置機制。
    • @ComponentScan:掃描?@Component@Service@Controller?等組件。
2. 自動配置的原理
  • @EnableAutoConfiguration?會觸發 Spring Boot 的自動配置機制:
    1. 加載候選配置類
      從?classpath:/META-INF/spring.factories?文件中讀取所有候選的自動配置類(如?DataSourceAutoConfiguration)。
    2. 條件過濾
      通過?@Conditional?注解(如?@ConditionalOnClass@ConditionalOnMissingBean)判斷是否滿足配置條件。
      例如:若 classpath 中存在?DataSource?類且用戶未手動配置數據源,則自動配置 HikariCP 連接池。
3. 嵌入式服務器啟動流程
  1. 類型推斷
    根據依賴(如?spring-boot-starter-web)判斷應用類型(Web 應用或非 Web 應用)。
  2. 服務器初始化
    自動配置并啟動嵌入式服務器(如 Tomcat),將 Spring 應用上下文注冊到服務器中。
  3. 應用上下文加載
    創建?AnnotationConfigServletWebServerApplicationContext(Web 應用)或?AnnotationConfigApplicationContext(非 Web 應用),加載 Bean 定義。
4. 外部化配置
  • 配置優先級(從高到低):
    1. 命令行參數(如?--server.port=8081)。
    2. 環境變量(如?SERVER_PORT=8081)。
    3. application.properties?或?application.yml
    4. 自動配置默認值。

三、Spring Boot 的架構圖

plaintext

┌─────────────────────────────────────────────────────────────┐
│                    Spring Boot Application                    │
└───────────────────┬───────────────────────────┬───────────────┘│                           │
┌───────────────────┼───────────────────────────┼───────────────┐
│         Auto-configuration                     │ Actuator     │
│  ┌───────────────────┐  ┌───────────────────┐  │              │
│  │ Web Auto-config   │  │ Data Auto-config  │  │  ┌────────┐  │
│  │ (Tomcat, MVC)     │  │ (JPA, JDBC)       │  │  │Health  │  │
│  └───────────────────┘  └───────────────────┘  │  │Metrics │  │
└─────────────────────────────────────────────────┘  └────────┘  ││
┌─────────────────────────────────────────────────────────────┐
│                      Spring Framework                        │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐  ┌───────┴───────┐
│  │ Core        │  │ AOP         │  │ Data Access │  │ Web MVC       │
│  │ (IoC, DI)   │  │ (AspectJ)   │  │ (JPA, JDBC) │  │ (REST, MVC)   │
│  └─────────────┘  └─────────────┘  └─────────────┘  └───────────────┘
└───────────────────────────────────────────────────────────────────────┘

四、開發流程示例

1. 創建項目
  • 使用 Spring Initializr(https://start.spring.io),選擇依賴(如 Web、JPA、MySQL)。
2. 核心代碼結構

plaintext

src/main/java/
└── com/example/demo/├── DemoApplication.java        # 啟動類├── controller/                # 控制器層├── service/                   # 服務層├── repository/                # 數據訪問層└── model/                     # 實體類
src/main/resources/├── application.properties     # 配置文件└── static/                    # 靜態資源
3. 關鍵代碼示例

java

// 啟動類
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}// 控制器示例
@RestController
@RequestMapping("/api")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/users")public List<User> getUsers() {return userService.getAllUsers();}
}// 配置文件示例 (application.properties)
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=123456
server.port=8080

五、Spring Boot 與 Spring 的關系

  • Spring 框架:提供 IoC(控制反轉)、AOP(面向切面編程)、事務管理等基礎功能,但配置繁瑣。
  • Spring Boot:基于 Spring 框架,通過自動配置和 Starter 依賴簡化開發,使 Spring 應用更易于構建和部署。

六、Spring Boot 的最佳實踐

  1. 使用 Starter 依賴:避免手動管理依賴版本,減少沖突。
  2. 外部化配置:將環境相關配置(如數據庫連接)放在?application.properties?或?application.yml?中。
  3. Actuator 監控:啟用 Actuator 端點,監控應用健康狀態和性能指標。
  4. 測試:使用?@SpringBootTest?注解編寫集成測試。
  5. 打包與部署:使用?spring-boot-maven-plugin?或?spring-boot-gradle-plugin?打包為可執行 JAR。

七、擴展知識

  1. Spring Cloud:基于 Spring Boot,提供微服務架構的全套解決方案(服務注冊、配置中心、負載均衡等)。
  2. Spring Security:與 Spring Boot 集成,簡化身份驗證和授權配置。
  3. Docker 集成:通過 Dockerfile 將 Spring Boot 應用容器化,便于部署。

Spring Boot 通過 “約定優于配置” 的理念,極大降低了 Spring 應用的開發門檻,成為構建微服務和企業級應用的首選框架。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88504.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88504.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88504.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

3.4 ASPICE的系統架構與設計過程

ASPICE&#xff08;Automotive SPICE&#xff09;在系統架構與設計過程中&#xff0c;強調了在汽車軟件開發中確保系統穩定性、可靠性和安全性的重要性。以下是ASPICE在系統架構與設計過程中的主要內容和步驟&#xff1a;系統架構設計準備階段&#xff1a;需求分析&#xff1a;…

自助KTV選址指南與優化策略

選址四大鐵律&#xff08;硬性條件&#xff09;產權合規&#xff1a;純商業產權消防雙通道&#xff1a;必須通過消防驗收遠離敏感區&#xff1a;距居民區、學校、醫院等200米以上面積達標&#xff1a;滿足包廂規劃需求選址核心邏輯&#xff08;優先級排序&#xff09;要素關鍵策…

深度學習11(調參設參+批標準化)

調參技巧對于調參&#xff0c;通常采用跟機器學習中介紹的網格搜索一致&#xff0c;讓所有參數的可能組合在一起&#xff0c;得到N組結果。然后去測試每一組的效果去選擇。 假設我們現在有兩個參數 α&#xff1a;0.1, 0.01, 0.001β&#xff1a;0.8, 0.88. 0.9這樣會有9種…

Python 中 enumerate(s) 和 range() 的對比

一、enumerate(s) 是什么&#xff1f;for i, c in enumerate(s):...enumerate(s) 是一個內置函數&#xff0c;用于在遍歷可迭代對象時&#xff0c;同時獲得元素的索引和值。它返回的是一個**(index, element)** 元組。常用于遍歷字符串、列表、元組等時&#xff0c;如果你既想拿…

【一起來學AI大模型】RAG系統流程:查詢→向量化→檢索→生成

RAG&#xff08;Retrieval-Augmented Generation&#xff09;系統核心流程非常精準&#xff1a; 查詢 → 向量化 → 檢索 → 生成 這是 RAG 實現“知識增強”的關鍵路徑。下面我們結合具體組件&#xff08;如 ChromaDB、LangChain 檢索器&#xff09;詳細拆解每個步驟&#xff…

圖像硬解碼和軟解碼

一、什么是圖像解碼&#xff1f; 圖像解碼是指將壓縮編碼&#xff08;如 JPEG、PNG、WebP、H.264/AVC、H.265/HEVC 等格式&#xff09;的圖像或視頻數據還原為原始像素數據&#xff08;如 RGB、YUV&#xff09;的過程。 解碼可以在CPU&#xff08;軟件解碼&#xff09;或專用硬…

Camera2API筆記

1. 常用對象CameraManager 相機服務。用于獲取相機對象和相機信息。CameraDevices 相機設備。負責連接相機、創建會話、生成拍攝請求&#xff0c;管理相機生命周期。CameraCaptureSession 相機拍攝會話。用于預覽和拍攝。一個相機只能有一個活躍會話。打開新會話時&#xff0c;…

觸控屏gt1947

比較器判斷是否翻轉&#xff0c;周期控制器負責控制周期&#xff08;period&#xff09;。sample采器有多個影子&#xff0c;每次采樣查看是否到了翻轉的時候。

DNS和ICMP

域名介紹在網絡通信中&#xff0c;需要用到ip加port&#xff0c;但是ip并不方便記憶&#xff0c;于是我們常用域名來對應一個ip例如&#xff1a;www.baidu.com 對應 156.36.56.98&#xff08;隨便寫的&#xff09;com: 一級域名. 表示這是一個企業域名. 同級的還有 "…

2022 年 12 月青少年軟編等考 C 語言六級真題解析

目錄 T1. 電話號碼T2. 區間合并T3. 撲克牌排序T4. 現代藝術思路分析T1. 電話號碼 題目鏈接:SOJ D1137 此題為 2021 年 12 月六級第一題原題,見 2021 年 12 月青少年軟編等考 C 語言六級真題解析中的 T1。 T2. 區間合并 題目鏈接:SOJ D1112 此題為 2021 年 9 月六級第三…

無鎖隊列:從零構建生產者-消費者數據結構

高性能無鎖隊列&#xff1a;從零構建生產者-消費者數據結構 問題的本質 生產者-消費者問題的核心挑戰不在于數據傳輸&#xff0c;而在于協調。傳統的鎖機制雖然簡單&#xff0c;但帶來了三個致命問題&#xff1a; 性能瓶頸&#xff1a;線程阻塞和上下文切換優先級反轉&#xff…

JAVA面試寶典 -《Spring IOC核心:Bean生命周期全解析》

文章目錄&#x1f331; 《Spring IOC核心&#xff1a;Bean生命周期全解析》1?? 引言&#xff1a;Bean 生命周期為什么重要&#xff1f;2?? Bean 生命周期概覽&#xff08;圖示 簡要說明&#xff09;3?? 每一步詳細解析&#xff08;源碼理解 示例&#xff09;3.1 &#…

Python 類型注解實戰:`Optional` 與安全數據處理的藝術

Python 類型注解實戰&#xff1a;Optional 與安全數據處理的藝術 在 Python 開發中&#xff0c;類型注解&#xff08;Type Hints&#xff09;已經成為現代 Python 項目的標配。本文將通過一個真實的認證令牌獲取函數 get_auth_token()&#xff0c;深入解析 Optional 類型的應用…

深入MyBatis:CRUD操作與高級查詢實戰

引言 在上一篇文章中&#xff0c;我們介紹了Mybatis的基礎使用。 如有需要請移步查看&#xff1a; MyBatis入門&#xff1a;快速掌握用戶查詢實戰https://blog.csdn.net/qq_52331401/article/details/149270402?spm1001.2014.3001.5502 今天&#xff0c;我將通過一個完整的…

Flink DataStream API詳解(二)

一、引言 咱兩書接上回&#xff0c;上一篇文章主要介紹了DataStream API一些基本的使用&#xff0c;主要是針對單數據流的場景下&#xff0c;但是在實際的流處理場景中&#xff0c;常常需要對多個數據流進行合并、拆分等操作&#xff0c;以滿足復雜的業務需求。Flink 的 DataS…

Unity3D游戲線上崩潰排查指南

前言 排查Unity3D線上游戲崩潰是個系統工程&#xff0c;需要結合工具鏈、日志分析和版本管理。以下是詳細的排查指南和關鍵步驟&#xff1a; 對惹&#xff0c;這里有一個游戲開發交流小組&#xff0c;希望大家可以點擊進來一起交流一下開發經驗呀&#xff01; 一、崩潰信息收…

DPDK性能優化實踐:系統級性能調優的方法論與實戰(一套通用的方法論)

性能優化的挑戰與現實困境 在高性能網絡處理領域&#xff0c;性能優化往往被視為一門“玄學”而非科學。許多開發者在面對性能瓶頸時&#xff0c;要么盲目追求單一指標的極致優化&#xff0c;要么采用"試錯法"進行零散的局部調優&#xff0c;結果往往是投入大量精力卻…

Docker的/var/lib/docker/目錄占用100%的處理方法

文章目錄 一、問題描述 二、解決措施 三、可能遇到的問題 問題1、問題描述&#xff1a;執行 sudo systemctl stop docker 命令時&#xff0c;提示 Warning: Stopping docker.service, but it can still be activated by: docker.socket 問題2、問題描述&#xff1a;執行 s…

【UE教程/進階】Slate鏈式編輯原理

目錄鏈式編輯操作" . "操作" "操作" [ ] "鏈式編輯 SNew().&#xfeff;[] 操作" . " SLATE_ARGUMENT(ArgType, ArgName) 宏 調用宏 SLATE_PRIVATE_ARGUMENT_VARIABLE(ArgType, ArgName) &#xff0c;在FArgument結構體中添加了變量…

將手工建模模型(fbx、obj)轉換為3dtiles的免費工具!

文章目錄1、工具下載2、使用說明3、詳細說明命令行格式示例命令參數說明4、源碼地址1、工具下載 百度網盤下載鏈接 選擇最新版本下載即可&#xff0c;支持Linux和Windows系統 2、使用說明 1&#xff09;按住鍵盤winr鍵&#xff0c;在彈出的窗口中輸入cmd 2&#xff09;點擊…