Spring Boot 第一天知識匯總

一、Spring Boot 是什么?

簡單說,Spring Boot 是簡化 Spring 應用開發的框架 —— 它整合了整個 Spring 技術棧,提供了 “一站式” J2EE 開發解決方案。

核心優點

  • 快速創建獨立運行的 Spring 項目,無需繁瑣配置;
  • 內置 Tomcat、Jetty 等 Servlet 容器,應用無需打 war 包,直接用?java -jar?運行;
  • 提供 “啟動器(Starter)” 自動管理依賴,避免版本沖突;
  • 大量自動裝配,開箱即用,還能靈活修改默認值;
  • 無需 XML 配置,純注解開發;
  • 自帶準生產環境監控(如健康檢查、指標收集)。

二、Spring Boot 項目創建方式

1. 手動創建(Maven 項目改造)

適合想深入理解依賴關系的場景,步驟如下:

  1. 新建 Maven 項目(打包方式選 jar);
  2. 在?pom.xml?中添加父工程(統一版本管理):
    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.0</version> <!-- 版本可按需選擇 -->
    </parent>
    
  3. 導入所需場景的啟動器(如 web 開發):
    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
    </dependencies>
    
  4. 編寫主程序類(啟動入口):
    @SpringBootApplication
    public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
    }
    
  5. 編寫 Controller 等業務代碼,運行 main 方法即可啟動。

2. 快速創建(Spring Initializer)

適合快速開發,IDE(如 IDEA、Eclipse)都支持:

  1. 新建項目時選擇 “Spring Initializr”;
  2. 填寫項目信息(Group、Artifact 等);
  3. 勾選所需依賴(如 Web、MySQL、MyBatis 等);
  4. 生成項目后,主程序類、目錄結構已自動創建,直接編寫業務代碼即可。

三、為什么說 “約定大于配置”?

這是 Spring Boot 最核心的思想,簡單理解:提前約定好一套規范,開發者無需手動配置,按約定開發即可

在傳統開發中,很多工作需要通過配置文件(如 XML、JSON、注解等)明確指定細節(比如類的位置、方法的映射規則、資源的路徑等)。但這些配置往往是 “重復性” 的 —— 大多數項目的需求是相似的,比如 “控制器類通常放在controller目錄”“數據庫表名通常和實體類名對應”。

“約定大于配置” 的本質是:框架或工具預先定義這些 “常見規則” 作為 “約定”,開發者只需遵循約定,就能省略這些重復配置;只有當需求特殊(比如想把控制器放在api目錄而非controller),才需要手動配置來 “覆蓋約定”。

比如:

Spring Boot 的目錄約定

早期的 Spring 框架需要大量 XML 配置來指定 “哪個類是控制器”“哪個方法映射哪個 URL”“服務類如何注入”。而 Spring Boot 采用 “約定大于配置” 后,通過目錄結構約定簡化了這些工作:

  • 約定:src/main/java/com/xxx/controller?目錄下的類默認是控制器(無需額外注解聲明 “這是控制器”);
  • 約定:src/main/java/com/xxx/service?目錄下的類默認是服務層(框架會自動掃描并管理依賴注入);
  • 約定:配置文件默認放在?src/main/resources/application.properties(無需指定 “配置文件在哪”);
  • 約定:Web 應用默認端口是 8080(無需配置 “服務器端口”)。

好處:減少重復配置,提高開發效率,團隊協作更規范(大家都按同一套約定開發)。

四、Starter 啟動器:依賴管理的 “萬能鑰匙”

Starter(啟動器)?是 “約定大于配置” 理念的典型實踐,也是 Spring Boot 對 “場景化開發” 的解決方案:一個 Starter 對應一個開發場景,導入它就會自動包含該場景所需的所有依賴

傳統的 Spring 項目開發中,開發者需要手動做兩件麻煩事:

  • 依賴管理:為了實現某個功能(如 Web 開發),需要手動引入一系列相關依賴(如 Spring MVC、Tomcat、Jackson 等),且要保證依賴版本兼容,否則容易出現 “jar 包沖突”。
  • 基礎配置:引入依賴后,還需要手動配置基礎組件(如 DispatcherServlet、數據源、事務管理器等),配置繁瑣且重復。

Starter 的出現就是為了解決這兩個問題:它通過 “預定義約定”,把某一場景所需的依賴、默認配置打包好,開發者只需引入一個 Starter,就能自動獲得該場景的所有必要支持。

比如:

  • spring-boot-starter-web:包含 web 開發所需的 Spring MVC、Tomcat、JSON 解析等依賴;
  • spring-boot-starter-jdbc:包含 JDBC 開發所需的數據源、事務管理等依賴;
  • spring-boot-starter-test:包含單元測試所需的 JUnit、Mockito 等依賴。

使用方式:只需在?pom.xml?中添加對應的 Starter 依賴,Spring Boot 會自動處理依賴傳遞和版本匹配,無需手動導入一堆 jar 包。

五、Spring Boot 整合單元測試

Spring Boot 簡化了單元測試流程,只需兩步:

  1. 導入測試 Starter

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
    </dependency>
    
  2. 編寫測試類
    用?@SpringBootTest?標注測試類(自動加載 Spring 上下文),結合 JUnit 的?@Test?即可:

    @SpringBootTest // 加載 Spring 容器
    public class UserControllerTest {@Autowiredprivate UserController userController; // 注入要測試的組件@Testpublic void testHello() {String result = userController.hello();System.out.println(result); // 輸出測試結果}
    }
    

Spring Boot 整合單元測試和spring區別?

一、依賴管理與配置

對比項傳統 SpringSpring Boot
依賴引入手動添加 JUnit、Mockito、Spring Test 等依賴,需處理版本兼容問題。通過?spring-boot-starter-test?一鍵引入所有測試依賴,自動管理版本。
配置文件需要手動配置?applicationContext.xml?或 Java 配置類,指定組件掃描路徑、數據源等。自動加載默認配置,僅需?application.properties?覆蓋少數自定義配置。
測試環境搭建需使用?@ContextConfiguration?注解指定配置文件或配置類。使用?@SpringBootTest?自動加載完整 Spring 上下文,或通過切片測試(如?@WebMvcTest)加載部分組件。

二、測試注解與框架支持

對比項傳統 SpringSpring Boot
核心測試注解@RunWith(SpringJUnit4ClassRunner.class)?+?@ContextConfiguration@SpringBootTest(替代前者) + 切片測試注解(如?@WebMvcTest@DataJpaTest
模擬 HTTP 請求使用?MockMvcBuilders.standaloneSetup()?手動配置 MockMvc。自動注入?MockMvc,通過?@AutoConfigureMockMvc?啟用。
數據庫測試需手動配置嵌入式數據庫(如 H2)或使用內存數據庫。自動配置嵌入式數據庫,支持?@DataJpaTest?專用注解。
屬性配置測試需使用?@TestPropertySource?手動指定測試配置文件。支持?@TestConfiguration?或直接在測試類中覆蓋屬性。

三、測試效率與簡化程度

場景傳統 SpringSpring Boot
單元測試(Service)java<br>@RunWith(SpringJUnit4ClassRunner.class)<br>@ContextConfiguration(classes = AppConfig.class)<br>public class UserServiceTest {<br> @Autowired<br> private UserService userService;<br> // 測試代碼<br>}java<br>@SpringBootTest<br>public class UserServiceTest {<br> @Autowired<br> private UserService userService;<br> // 測試代碼<br>}
Controller 測試需手動配置 Controller、Service Mock 和視圖解析器。java<br>@WebMvcTest(UserController.class)<br>public class UserControllerTest {<br> @Autowired<br> private MockMvc mockMvc;<br> @MockBean<br> private UserService userService;<br> // 測試代碼<br>}
數據庫集成測試需配置數據源、事務管理器,手動回滾數據。java<br>@DataJpaTest<br>public class UserRepositoryTest {<br> @Autowired<br> private UserRepository userRepository;<br> // 測試代碼(自動回滾)<br>}

六、Spring Boot 如何掃描組件?

Spring Boot 會自動掃描并加載容器中的組件(@Controller、@Service、@Component 等),掃描范圍由?主程序類(@SpringBootApplication 標注)所在包及所有子包?決定。

比如:

  • 主程序類在?com.example.demo?包下;
  • 則?com.example.demo.controllercom.example.demo.service?等子包中的組件會被自動掃描;
  • 若組件放在?com.example.other?包(主程序類所在包的外部),則需要手動添加?@ComponentScan("com.example.other")?配置。

七、YAML 配置文件:比 properties 更優雅

Spring Boot 支持?application.yml?作為配置文件,語法比?application.properties?更簡潔,適合復雜配置。

基本語法:

  • 用?k: v?表示鍵值對(冒號后必須有空格);
  • 用縮進表示層級關系(不允許用 tab,建議 2 個空格);
  • 大小寫敏感。

示例:

# 配置服務器端口
server:port: 8081servlet:context-path: /demo # 項目訪問路徑# 配置自定義對象
person:name: 張三age: 20boss: falsebirth: 2003-01-01maps: {k1: v1, k2: v2} # Map 寫法lists: [籃球, 足球] # List 寫法dog: # 對象嵌套name: 旺財age: 3

如何讀取配置?

用?@ConfigurationProperties?綁定配置到 Java 類:

@Component
@ConfigurationProperties(prefix = "person") // 綁定配置文件中 prefix 為 person 的屬性
public class Person {private String name;private Integer age;// 省略 get/set 方法
}

八、自動裝配原理:Spring Boot 如何 “自動” 工作?

自動裝配是 Spring Boot “開箱即用” 的核心,簡單說:Spring Boot 會根據導入的 Starter 和配置,自動創建并配置所需的組件(比如導入 web starter 會自動配置 DispatcherServlet)。

自動裝配的本質是Spring 框架在啟動時動態掃描并注冊 Bean,但 Spring Boot 在此基礎上增加了條件判斷約定配置

  1. 條件判斷:通過?@Conditional?系列注解,根據類路徑、配置屬性、Bean 存在性等條件決定是否注冊 Bean。
  2. 約定配置:框架預定義了一套默認配置(如數據源、Web 服務器),開發者只需引入依賴即可觸發相應配置。

核心依賴三個注解:

  1. @SpringBootApplication
    主程序類的核心注解,是一個 “組合注解”,包含:

    • @SpringBootConfiguration:標記當前類為配置類(相當于?@Configuration);
    • @EnableAutoConfiguration:開啟自動配置(核心);
    • @ComponentScan:指定組件掃描范圍(默認主程序類所在包)。
  2. @EnableAutoConfiguration
    開啟自動配置的 “開關”,通過?@Import(EnableAutoConfigurationImportSelector.class)?向容器中導入自動配置類(xxxAutoConfiguration)。

    原理:啟動時會掃描所有 jar 包中?META-INF/spring.factories?文件,加載其中?org.springframework.boot.autoconfigure.EnableAutoConfiguration?對應的配置類(如?HttpEncodingAutoConfigurationDataSourceAutoConfiguration?等),這些類會自動配置所需組件。

  3. @ConfigurationProperties
    將配置文件中的屬性(如?application.yml?中的?person.name)綁定到 Java 類的屬性上,實現配置與代碼的解耦。

九、Spring Boot 項目演變史

從傳統 Java 開發到 Spring Boot,經歷了多個階段:

  1. Servlet 時代:純手動編寫 Servlet、配置 web.xml,開發效率極低;
  2. SSH/SSM 時代:SSH(Struts + Spring + Hibernate)、SSM(Spring + SpringMVC + MyBatis)簡化了開發,但仍需大量 XML 配置;
  3. 單體應用:所有功能打包成一個 war 包,部署到 Tomcat,適合小型項目,但迭代和擴展困難;
  4. SOA(面向服務架構):將系統拆分為多個服務,通過服務總線通信,但服務耦合度仍較高;
  5. 微服務:2014 年 Martin Fowler 提出,將系統拆分為獨立部署的小型服務(每個服務專注一個功能),通過 HTTP 通信。Spring Boot 因簡化配置、內置容器等特點,成為微服務開發的首選框架。

十、架構對比:垂直架構、單體架構與微服務

架構類型特點優點缺點
垂直架構按業務垂直劃分(如電商的訂單系統、用戶系統獨立部署)簡單直接,初期開發快服務重復開發,數據冗余
單體架構所有功能打包成一個應用(如一個 war 包包含所有模塊)部署簡單,調試方便代碼臃腫,迭代慢,故障影響整體
微服務拆分為獨立部署的小型服務(每個服務有自己的數據庫和接口)獨立迭代、擴展靈活,技術棧多樣分布

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

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

相關文章

MySql主從部署

MySql主從部署 1、操作環境 硬件環境&#xff1a;香橙派5 aarch64架構 軟件環境&#xff1a;Ubuntu 22.04.3 LTS 軟件版本&#xff1a;mysql-8.0.42 操作方式&#xff1a;mysql_1,mysql_2容器 主節點&#xff1a;mysql_1 啟動命令&#xff1a;docker run --name mysql_master \…

Redis——Redis進階命令集詳解(下)

本文詳細介紹了Redis一些復雜命令的使用&#xff0c;包括Redis事務相關命令&#xff0c;如MULTI、EXEC、DISCARD 和 WATCH ,發布訂閱操作命令&#xff0c;如PUBLISH 、SUBSCRIBE 、PSUBSCRIBE ,BitMap操作命令&#xff0c;如SETBIT、GETBIT、BITCOUNT、BITOP&#xff0c;HyperL…

C#使用socket報錯 System.Net.Sockets.SocketException:“在其上下文中,該請求的地址無效。

bind: 在其上下文中&#xff0c;該請求的地址無效。問題定位 程序中運行socket服務端程序時&#xff0c;綁定的IP地址無效&#xff0c;即請求的IP地址在你的機子上找不到。原因有以下幾種可能&#xff1a; 1&#xff09;server端綁定的IP地址不是本機的IP地址。 2&#xff09;之…

計算機底層入門 05 匯編學習環境通用寄存器內存

2.3 匯編學習環境我們通過上一章筆記&#xff0c;得知 計算機好像 只會通過位運算 進行 數字的加法。 而機器語言的魅力就是 位運算&#xff0c;解析規則。它們也都是通過 電路 來進行實現的。這就是 計算機最底層的本質了&#xff01;&#xff01;&#xff01; 匯編語言 所謂的…

Java學習---Spring及其衍生(上)

在 Java 開發領域&#xff0c;Spring 生態占據著舉足輕重的地位。從最初的 Spring 框架到后來的 SpringBoot、SpringMVC 以及 SpringCloud&#xff0c;每一個組件都在不同的場景下發揮著重要作用。本文將深入探討這幾個核心組件&#xff0c;包括它們的定義、原理、作用、優缺點…

LVGL應用和部署(個人開發嵌入式linux產品)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】隨著經濟越來越走向常態化發展&#xff0c;將來的公司基本是兩個趨勢&#xff0c;一個是公司越做越大&#xff0c;越來越趨向于壟斷&#xff1b;另外…

CPU,減少晶體管翻轉次數的編碼

背景 以4比特為單位&#xff0c;共16個數。仔細思考狀態轉換過程中的晶體管翻轉次數。 0000 0001&#xff0c;1 0010&#xff0c;2 0011&#xff0c;1 0100&#xff0c;3 0101&#xff0c;1 0110&#xff0c;2 0111&#xff0c;1 1000&#xff0c;4 1001&#xff0c;1 1010&…

LLM 中的 溫度怎么控制隨機性的?

LLM 中的 溫度怎么控制隨機性的? 在LLM的解碼過程中,溫度(Temperature)通過調整token概率分布的“陡峭程度”來控制隨機性:溫度越低,概率分布越陡峭(高概率token的優勢越明顯),隨機性越低;溫度越高,分布越平緩(高低概率token的差異被縮小),隨機性越高。 溫度,…

freemodbus使用

文章目錄? **CubeMX配置**1. UART配置&#xff08;RS485通信&#xff09;2. Timer配置&#xff08;RTU字符間隔檢測&#xff09;3. GPIO配置&#xff08;RS485方向控制&#xff09;? **STM32F103 RS485 FreeModbus RTU 配置概覽****1?? CubeMX硬件配置****2?? FreeModb…

【Ansible】Ansible 管理 Elasticsearch 集群啟停

一、集群節點信息 通過 Ansible inventory 定義的集群節點分組如下&#xff1a;[es]&#xff08;Elasticsearch 節點&#xff09; 192.168.100.150192.168.100.151192.168.100.152[logstash]&#xff08;Logstash 節點&#xff09; 192.168.100.151[kibana]&#xff08;Kibana …

Effective Python 第15條 不要過分依賴給字典添加條目時所用的順序

引言&#xff1a;字典順序的重要性 在Python編程中&#xff0c;字典&#xff08;dict&#xff09;是一種常用的數據結構&#xff0c;用于存儲鍵值對。然而&#xff0c;字典的迭代順序問題常常困擾著開發者。從Python 3.7開始&#xff0c;字典保證了鍵的插入順序&#xff0c;這一…

事務隔離級別和傳播方式

事務隔離級別 事務隔離級別是數據庫系統中控制事務間相互影響程度的重要機制。不同的隔離級別在數據一致性保證和系統性能之間提供不同的權衡選擇。下面我將詳細解析四種標準隔離級別、它們能解決的問題以及可能存在的并發問題。 一、四種標準隔離級別 1. 讀未提交 (Read Uncom…

不同地區的主要搜索引擎工具

研究seo&#xff0c;想匯總一下不同國家的搜索引擎工具&#xff0c;順帶了解一下這些公司提供的服務。 韓國&#xff1a;NAVER——>LINE 日本: 我還不知道&#xff0c;如果你知道可以評論告訴我 俄羅斯&#xff1a;yandex yandex有點像本土化的google 搜索引擎 郵箱 網盤 在…

實操:AWS CloudFront的動態圖像轉換

概述 適用于 Amazon CloudFront 的動態圖像轉換&#xff08;前身為無服務器圖像處理器&#xff09;&#xff0c;通過 Amazon CloudFront 的全球內容分發網絡&#xff08;CDN&#xff09;實現實時圖像處理。此 AWS 解決方案可幫助您優化視覺內容交付&#xff0c;同時顯著降低運營…

Spring Boot 實戰詳解:從靜態資源到 Thymeleaf 模板引擎

Spring Boot 憑借其 "約定大于配置" 的理念&#xff0c;極大簡化了 Java 應用開發流程。本文將從 Spring Boot 核心特性出發&#xff0c;詳細解析靜態資源映射規則、Thymeleaf 模板引擎的使用&#xff0c;并結合完整實戰案例&#xff0c;幫助開發者快速上手 Spring B…

docker的鏡像與推送

docker build# 1. 基本構建命令&#xff08;使用當前目錄的 Dockerfile&#xff09; docker build .# 2. 指定 Dockerfile 路徑和構建上下文 docker build -f /path/to/Dockerfile /path/to/build/context# 3. 為鏡像設置名稱和標簽 docker build -t my-image:latest .# 4. 設置…

計算機網絡學習----域名解析

在互聯網世界中&#xff0c;我們習慣通過域名&#xff08;如www.example.com&#xff09;訪問網站&#xff0c;而非直接記憶復雜的 IP 地址&#xff08;如 192.168.1.1&#xff09;。域名與 IP 地址之間的轉換過程&#xff0c;就是域名解析。它是互聯網通信的基礎環節&#xff…

構建高性能推薦系統:MixerService架構解析與核心實現

——深入剖析推薦服務的分層設計、工作流引擎與高可用策略 一、整體架構與分層設計 該推薦服務采用經典分層架構模式?7&#xff0c;各層職責清晰&#xff1a; ?HTTP接口層? 支持 GET/POST 請求解析&#xff0c;自動映射參數到 RcmdReq 協議對象統一錯誤處理&#xff1a;參…

【安全漏洞】隱藏服務器指紋:Nginx隱藏版本號配置修改與重啟全攻略

?? 隱藏服務器指紋:Nginx配置修改與重啟全攻略 你是否知道,默認情況下Nginx會在HTTP響應頭中暴露版本號?這個看似無害的Server: nginx/1.x.x字段,實則可能成為黑客的"藏寶圖"。今天我們就來揭秘如何通過簡單配置提升服務器安全性,并手把手教你完成Windows環境…

構建RAG智能體(2):運行狀態鏈

在現代AI應用開發中&#xff0c;如何讓聊天機器人具備記憶能力和上下文理解是一個核心挑戰。傳統的無狀態對話系統往往無法處理復雜的多輪對話場景&#xff0c;特別是當用戶需要提供多種信息來完成特定任務時。 本文就來討論一下如何利用runnable來編排更有趣的語言模型系統&a…