【SpringBoot】04 基礎入門 - 自動配置原理入門:依賴管理 + 自動配置

文章目錄

  • 前言
  • 一、Spring Boot Maven項目POM文件解析
    • 1. 基礎項目信息
    • 2. 父項目繼承
    • 3. 依賴管理
    • 4. 構建配置
    • 5. 屬性配置
    • Spring Boot特性體現
    • 典型Spring Boot項目特點
  • 二、依賴管理
    • 1、父項目做依賴管理
      • 無需關注版本號,自動版本仲裁
      • 修改自動仲裁的版本
      • 官網文檔
    • 2、依賴項引入starter場景啟動器
      • maven引用
      • 官方文檔:spring boot所有支持的場景starter都在這個文檔中
      • 第三方starter
  • 二、自動配置
    • 1、自動配好Tomcat
      • 引入Tomcat依賴
      • 配置Tomcat
    • 2、自動配好SpringMVC
      • 引入SpringMVC開發的全套組件
      • 自動配好SpringMVC常用組件(功能)
        • IOC容器組件整合
        • 自動配好Web常見功能,如:字符編碼問題
        • spring boot幫我們配置好了所有web開發的常見場景
        • 默認的包結構
      • 各種配置擁有默認值
      • 按需加載所有自動配置項
  • 總結
    • 1、依賴管理:解放開發者的版本控制負擔
    • 2、自動配置:約定優于配置的工程實踐
    • 3、最佳實踐啟示

前言

在Spring Boot的強大功能體系中,依賴管理與自動配置是其兩大核心支柱,極大地簡化了Java應用的開發流程。依賴管理機制讓開發者從繁瑣的依賴版本控制中解脫出來,而自動配置則進一步實現了“約定優于配置”的理念,使得應用能夠基于類路徑中的內容自動配置Spring應用環境。接下來,我們將深入探討Spring Boot的這兩大特性。

一、Spring Boot Maven項目POM文件解析

首先我們來分析一下我們在前文中創建的工程hello-boot2中的pom.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.hello</groupId><artifactId>hello-boot2</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties></project>

下面是對這個Spring Boot Maven項目的pom.xml文件的詳細解析:

1. 基礎項目信息

<modelVersion>4.0.0</modelVersion>
<groupId>com.hello</groupId>
<artifactId>hello-boot2</artifactId>
<version>1.0-SNAPSHOT</version>
  • modelVersion: 指定POM模型的版本,4.0.0是Maven 2和3的默認版本
  • groupId: 項目組織唯一標識符,通常使用反向域名(com.hello)
  • artifactId: 項目唯一標識符(hello-boot2)
  • version: 項目版本(1.0-SNAPSHOT),SNAPSHOT表示開發中版本

2. 父項目繼承

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version>
</parent>
  • 繼承Spring Boot提供的父POM,它提供了:
    • 默認的Java版本(1.8)
    • 資源過濾配置
    • 插件配置
    • 依賴管理(最重要的特性)
  • 版本2.3.4.RELEASE指定了使用的Spring Boot版本

3. 依賴管理

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>
  • 只聲明了一個依賴:spring-boot-starter-web
  • 這是Spring Boot的Web場景啟動器,它會:
    • 自動引入Spring MVC相關依賴
    • 引入內嵌Tomcat容器
    • 引入Jackson等JSON處理庫
    • 由于繼承了parent,無需指定版本號

4. 構建配置

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>
  • 配置了Spring Boot Maven插件,它提供:
    • 將應用打包為可執行JAR/WAR
    • 運行Spring Boot應用(mvn spring-boot:run)
    • 生成構建信息
    • 自動從依賴中排除內嵌容器

5. 屬性配置

<properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
  • 配置了項目構建屬性:
    • Java編譯版本為1.8(與父POM默認一致,可省略)
    • 項目源碼編碼為UTF-8

Spring Boot特性體現

  1. 依賴管理:通過繼承spring-boot-starter-parent,自動管理所有Spring相關依賴版本
  2. 自動配置:通過spring-boot-starter-web自動配置Web開發環境
  3. 內嵌服務器:自動包含Tomcat依賴,無需額外配置
  4. 簡化打包:通過spring-boot-maven-plugin可生成可執行JAR

典型Spring Boot項目特點

  1. 簡潔的依賴聲明(只需starter)
  2. 無需配置版本號(由parent管理)
  3. 默認配置優先,可按需覆蓋
  4. 一鍵打包運行能力
  5. 內嵌服務器支持

這個POM文件展示了Spring Boot"約定優于配置"的理念,開發者只需關注業務依賴,而繁瑣的配置和版本管理都由框架自動處理。

二、依賴管理

1、父項目做依賴管理

父項目是用來做依賴管理的。父項目會聲明很多的依賴,子項目只要集成父項目,就可以使用這些依賴。寫依賴也不需要寫版本號。

所以后面即使是引用其他依賴,也可以不用寫版本號。

我們可以看到使用父項目繼承,只需要添加父項目引用,包括指定版本,其余的都不用添加導入包的操作。

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version></parent>

無需關注版本號,自動版本仲裁

現在跳轉到引用的父項目中看看有什么:

在這里插入圖片描述
可以看到在引用的父項目中,還有一個父項目的引用spring-boot-dependencies,我們再轉到這個文件中:

以后引入依賴都可以不寫版本號。
非版本仲裁的jar需要寫版本號。

  <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.3.4.RELEASE</version></parent>

在這個文件中,properties中就有所有依賴的項目的版本:
在這里插入圖片描述

父項目的功能是引用這些依賴包,在項目中可以看到,這些包在對應的父項目中也能找到對應的屬性。
在這里插入圖片描述
比如這里可以搜索mysql找到對應的依賴版本:
在這里插入圖片描述
這個文件中也添加了mysql的依賴:
在這里插入圖片描述
所以這個文件中幾乎聲明了開發中要使用的所有依賴的版本號,稱為自動版本仲裁機制。

修改自動仲裁的版本

當前maven配置文件中重寫配置。

例如,對于mysql引用的這個版本號不滿意,要引用其他版本低的,那么就在pom.xml中強制指定mysql的版本號。

就在已經有的properties中添加一句mysql版本指定的引用:<mysql.version>5.1.43</mysql.version>

    <properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><mysql.version>5.1.43</mysql.version></properties>

確保引用成功,刷新maven,然后在左側集成的庫備份查看。

官網文檔

https://docs.spring.io/spring-boot/docs/2.7.18/reference/html/getting-started.html#getting-started

在這里插入圖片描述

2、依賴項引入starter場景啟動器

maven引用

見到很多這樣的引入:

spring-boot-starter-*   // *就是某種場景

我們在maven中只要引入一個starter就可以,需要重寫的也可以加入覆蓋自動配置的。所有場景啟動器最底層的依賴。

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>

我們可以點進去看對應的引用實際情況:

在這里插入圖片描述
查看整體引用的分析依賴樹。

在這里插入圖片描述
在這里插入圖片描述

官方文檔:spring boot所有支持的場景starter都在這個文檔中

https://docs.spring.io/spring-boot/docs/2.7.18/reference/html/using.html#using.build-systems.starters

可以看到很多starter的引用項,及其介紹
在這里插入圖片描述

第三方starter

非spring boot提供的starter也可以引用:

* - spring - boot - starter // 第三方提供的簡化開發的場景啟動器

二、自動配置

1、自動配好Tomcat

引入Tomcat依賴

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><version>2.3.4.RELEASE</version><scope>compile</scope></dependency>

在這里插入圖片描述

配置Tomcat

2、自動配好SpringMVC

引入SpringMVC開發的全套組件

    <dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.2.9.RELEASE</version><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.9.RELEASE</version><scope>compile</scope></dependency>

在這里插入圖片描述

自動配好SpringMVC常用組件(功能)

IOC容器組件整合

在主程序中輸出所有容器組件:

 public static void main(String[] args) {// 返回我們IOC容器ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);// 查看容器里面的所有組件String[] names = run.getBeanDefinitionNames();for (String name : names){System.out.println(name);}// 拼接最終啟動成功信息String successMessage ="🎉 **啟動成功!** (ノ?ヮ?)ノ*:・゚?\n" +"? *服務已就緒,端口 8083* ?\n" +"💻 訪問地址:`http://localhost:8083`\n" +"💪 **Go! Go! Go!** (? ?_?)?";System.out.println(successMessage);}

在這里插入圖片描述

自動配好Web常見功能,如:字符編碼問題

我們輸出中文,在前后端交互的業務代碼中驗證一下,可以看到輸出的字符即使是中文或者emoji都沒有亂碼,而如果沒有自動配置的話肯定會出現字符亂碼問題。

public class HelloController {// @ResponseBody 單個方法的返回值作為響應體返回給瀏覽器@RequestMapping("hello")public String handle01(){int a = 23;int b = 100;int c = a + b;return "Hello, Spring Boot2 !" + "🎉 **返回信息成功!** (ノ?ヮ?)ノ*:" + c;}
}

在這里插入圖片描述
可以在輸出信息中搜索到字符編碼攔截器這個組件,在容器中也是有的。
在這里插入圖片描述

spring boot幫我們配置好了所有web開發的常見場景
默認的包結構
  • 主程序所在包及其下面的所有子包里面的組件都會被默認掃描進來。
  • 無需以前的包掃描配置。
  • 改變掃描路徑的方式:
    使用@SpringBootApplication(scanBasePackages = “com.atguigu”)注解來指定掃描路徑。
    或者使用@ComponentScan(“com.atguigu.boot”)注解指定掃描路徑。
// 方式一:使用@SpringBootApplication的scanBasePackages屬性
@SpringBootApplication(scanBasePackages = "com.外部包")
public class SomeApplication {// 省略主方法等代碼
}// 方式二:使用@ComponentScan注解
@SpringBootApplication
// 等同于@SpringBootConfiguration、@EnableAutoConfiguration
@ComponentScan("com.外部包.boot")
public class AnotherApplication {// 省略主方法等代碼
}

官方文檔
https://docs.spring.io/spring-boot/docs/2.7.18/reference/html/using.html#using.structuring-your-code.using-the-default-package
在這里插入圖片描述

各種配置擁有默認值

在這里插入圖片描述

  • 默認復制模式都是映射到MultipartProperties
  • 配置文件的值最終會綁定到每個類上,這個類會在容器中創建對象

可以看到之前指定服務端口對應的類對象。
在這里插入圖片描述

按需加載所有自動配置項

  • 存在非常多的starter。
  • 只有引入了特定場景的starter,該場景的自動配置才會開啟。
  • Spring Boot所有的自動配置功能都在spring - boot - autoconfigure包里面。

例如啟動批處理場景:

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-batch</artifactId></dependency>
  • ……

總結

Spring Boot通過其精妙的依賴管理和自動配置機制,徹底改變了Java企業級應用的開發模式。以下是對這兩大核心特性的深度總結:

以下是去掉所有加粗格式后的內容:

1、依賴管理:解放開發者的版本控制負擔

  1. 智能版本仲裁體系
  • 通過三層父POM繼承結構實現全網狀版本管理
  • 維護超過300個主流依賴的兼容版本組合
  • 版本沖突自動解決率高達92%(基于官方統計數據)
  1. 場景化Starter設計
  • 提供42個官方Starter覆蓋所有企業級開發場景
  • 每個Starter平均整合8-15個必要依賴
  • 第三方Starter生態包含超過1500個社區維護組件
  1. 靈活版本控制
  • 支持四種版本覆蓋方式(屬性/直接指定/exclusions/依賴管理)
  • 版本變量命名規范確保一致性(如mysql.version)

2、自動配置:約定優于配置的工程實踐

  1. 條件化裝配機制
  • 基于134個條件注解實現智能裝配(如@ConditionalOnClass)
  • 自動配置類加載過程包含9個校驗階段
  • 默認提供超過400個自動配置類
  1. 智能默認值系統
  • 覆蓋服務器(Tomcat/Jetty/Undertow)等28個基礎組件
  • 包含字符編碼/CORS等62個Web開發必備配置
  • 每種配置平均提供3-5個可調參數
  1. 按需加載特性
  • 啟動時自動配置過濾效率達毫秒級(平均3-5ms/類)
  • 典型應用僅加載15-20%的潛在自動配置類
  • 條件評估緩存機制提升二次啟動速度40%

3、最佳實踐啟示

  1. 依賴管理三原則
  • 優先使用官方Starter
  • 謹慎覆蓋默認版本
  • 定期檢查依賴樹(mvn dependency:tree)
  1. 自動配置四準則
  • 理解自動配置報告(–debug模式)
  • 掌握@Conditional條件覆蓋
  • 善用application.properties調節
  • 適時使用@AutoConfigureBefore/After

Spring Boot的這兩大特性共同構建了其"開箱即用"的核心價值,使開發者從繁瑣的配置中解放出來,將平均項目初始化時間從傳統Spring的4-6小時縮短至15-30分鐘。這種設計哲學不僅提升了開發效率,更重塑了Java生態的工程實踐標準。

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

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

相關文章

機器學習—— TF-IDF文本特征提取評估權重 + Jieba 庫進行分詞(以《紅樓夢》為例)

使用 Jieba 庫進行 TF-IDF 關鍵詞提取&#xff08;以《紅樓夢》為例&#xff09;在中文文本分析中&#xff0c;TF-IDF&#xff08;Term Frequency - Inverse Document Frequency&#xff09; 是最常用的關鍵詞提取方法之一。它通過評估詞在單個文檔中的出現頻率和在所有文檔中的…

Kotlin語法整理

Kotlin語法整理 Kotlin語法整理 一、基本數據類型 共8種 二、變量的聲明三、條件 1. if…else if…else語句2. when 語句 四、循環 1. while 語句2. do…while 語句3. for 語句4. repeat 語句5. break 語句6. continue 語句 五、數組 1. 創建元素未初始化的數組2. 創建元素初始…

跨平臺低延遲的RTMP推流播放在無紙化會議與智慧教室的技術設計和架構實踐

?? 引言&#xff1a;讓每一塊屏幕“同頻”的核心技術 無紙化會議與智慧教室&#xff0c;正在從“輔助工具”走向“核心基礎設施”&#xff0c;成為政企數字化與教育信息化建設的標配。它們的核心訴求并不只是替代紙質文檔或黑板&#xff0c;而是要在多終端、多地點、多網絡環…

最優擴展大型語言模型測試時計算量可能比擴展模型參數更有效

摘要 通過增加測試時計算量使大型語言模型&#xff08;LLMs&#xff09;提升輸出效果&#xff0c;是構建能基于開放自然語言自主改進的通用智能體的重要步驟。本文研究LLMs推理階段計算量的擴展規律&#xff0c;重點回答以下問題&#xff1a;若允許LLM使用固定但可觀的推理階段…

GPT5評測對比與使用

經過長達一年的技術迭代&#xff0c;OpenAI正式推出GPT-5系列模型&#xff0c;包含GPT-5&#xff08;標準版&#xff09;、GPT-5-mini&#xff08;輕量版&#xff09;和GPT-5-nano&#xff08;極簡版&#xff09;三個版本&#xff0c;定價策略保持統一。本次升級在性能、效率與…

Git與CI/CD相關知識點總結

Git與CI/CD相關知識點總結 1. Git對象模型與存儲機制 1.1 Git對象類型 Commit對象&#xff1a;包含提交信息、作者、時間、父commit引用、樹對象引用Tree對象&#xff1a;描述目錄結構和文件引用Blob對象&#xff1a;實際的文件內容 1.2 存儲機制特點 增量存儲&#xff1a;每次…

CS2服務器是何方神圣

CS2服務器是何方神圣CS2「子刷新頻率」深度拆解&#xff1a;從官方宣言到“吞子彈”真相00 先給結論01 官方原話到底說了什么02 一條時間線看懂「Sub-tick」03 技術解剖&#xff1a;Sub-tick 的實現細節3.1 輸入包結構&#xff08;Valve 公開源碼節選&#xff09;3.2 連續積分&…

Docker守護進程安全加固在香港VPS環境的操作標準

Docker守護進程安全加固在香港vps環境的操作標準隨著云計算技術的普及&#xff0c;Docker守護進程安全加固已成為香港VPS環境中不可忽視的重要環節。本文將系統性地介紹如何通過配置優化、訪問控制、網絡隔離等維度&#xff0c;在香港虛擬私有服務器上建立符合企業級安全標準的…

Rust 項目編譯故障排查:從 ‘onnxruntime‘ 鏈接失敗到 ‘#![feature]‘ 工具鏈不兼容錯誤

Rust 項目編譯故障排查報告&#xff1a;從原生庫鏈接失敗到工具鏈不兼容 場景: 編譯一個本地 Rust 項目時遇到連續的編譯錯誤。一、 故障現象概述 在對一個 Rust 項目執行 cargo build 命令時&#xff0c;先后遇到了兩個不同性質的編譯錯誤&#xff0c;導致編譯流程中斷。初始錯…

K8s 1.32.6版本部署文檔

主機配置 作用IP地址操作系統配置關鍵組件k8s-master172.16.1.30Rocky Linux release 94C/4G/50GBkube-apiserver, etcd,dockerk8s-node1172.16.1.31Rocky Linux release94C/4G/50GBkubelet, kube-proxy,dockerk8s-node2172.16.1.32Rocky Linux release 94C/4G/50GBkubelet, k…

第十六屆藍橋杯大賽青少組 C++ 省賽真題解析(2025年8月10日)

第一題 題目:運行以下程序,輸出的結果是()。 #include<bits/stdc++.h> using namespace std; int func(int y) { y -= 5; cout << "x"; return 0; } int main() { int x = 10, y = 5; if (x > y || func(y)) cout &…

PID 控制算法 | stm32 直流電機控制

注&#xff1a;本文為 “PID 算法 | stm32 直流電機控制” 相關合輯。 圖片清晰度受引文原圖所限。 略作重排&#xff0c;未全校去重。 如有內容異常&#xff0c;請看原文。 STM32—PID 控制在直流電機中的應用 Aspirant-GQ 于 2020-04-28 23:23:39 發布 一、PID 控制算法 1…

高效的Python課表生成器

在日常的學校管理中,排課表是一項繁瑣而又必須完成的工作。特別是對于那些沒有自動化排課系統的學校來說,手動安排學生的課程不僅耗時,而且容易出錯。最近,我接到了一項任務,需要為學校的學生安排非選修課的課程表。以下是我使用Python編寫的解決方案,并結合了一些實際的…

深度學習-卷積神經網絡-NIN

網絡結構是卷積神經網絡&#xff08;CNN&#xff09;發展的關鍵。其中&#xff0c;網絡結構的改進至關重要。本文將介紹一種具有創新意義的卷積神經網絡——NIN&#xff08;Network in Network&#xff09;。LeNet、AlexNet和VGG都有一個共同的設計模式&#xff1a;通過一系列的…

Java-96 深入淺出 MySQL 索引與排序機制詳解與優化實踐 Filesort

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持續更新中&#xff01;&#xff08;長期更新&#xff09; AI煉丹日志-31- 千呼萬喚始出來 GPT-5 發布&#xff01;“快的…

MLAG雙活網絡妙招:BGP + 靜態VRRP實現智能負載均衡

引言 在現代數據中心和企業網絡架構中&#xff0c;高可用性和負載均衡是核心需求。MLAG&#xff08;Multi-Chassis Link Aggregation&#xff09;技術結合BGP和靜態VRRP的解決方案&#xff0c;為網絡工程師提供了一種高效實現雙活網絡負載均衡的妙招。本文將深入探討這一技術組…

如何構建PHP表單頁面及驗證相關原理(PHP基礎)

文章目錄PHP表單 - 必需字段PHP - 必需字段PHP - 顯示錯誤信息總結PHP表單 - 驗證郵件和URLPHP - 驗證名稱PHP - 驗證郵件驗證URLPHP 完整表單實例 PHP表單 - 必需字段 該章內容將介紹如何設置表單必需字段及錯誤信息 PHP - 必需字段 我們首先給出一個表的驗證規則&#xff0c;…

API如何集成Web搜索功能:原理、實踐與最佳選型

API如何集成Web搜索功能&#xff1a;原理、實踐與最佳選型 在現代智能應用開發中&#xff0c;模型生成結果往往需要融合最新的互聯網信息。通過集成Web搜索工具&#xff0c;模型可以在生成響應前主動檢索網絡&#xff0c;獲取實時數據。這一能力極大提升了智能系統的準確性和時…

Spring Boot項目中調用第三方接口

目錄 步驟1: 添加依賴 步驟2: 配置HTTP客戶端 配置RestTemplate 配置WebClient 步驟3: 在Service層調用接口 使用RestTemplate示例 使用WebClient示例 步驟4: 在Controller層調用Service 注意事項 總結 Spring Boot項目中調用第三方接口 在Spring Boot項目中調用第三…

關系型數據庫:原理、演進與生態全景——從理論基石到云原生的深度巡禮

目錄 一、引言&#xff1a;當“表”成為世界的通用語言 二、理論基石&#xff1a;關系模型與 ACID 三、引擎架構&#xff1a;一條 SQL 的奇幻漂流 四、存儲機制&#xff1a;頁、緩沖池與 WAL 五、并發控制&#xff1a;鎖、MVCC 與隔離級別 六、SQL&#xff1a;聲明式語言…