文章目录

  • 前言
  • 一、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;声明式语言…