Spring、Spring Boot 与配置文件核心知识点详解

📅 2026/8/9 11:49:46
Spring、Spring Boot 与配置文件核心知识点详解
文章目录一、Spring、Spring Boot、Spring MVC 核心关系与区别1.1 Spring — 企业级开发的基石1.2 Spring MVC — Web 层子框架1.3 Spring Boot — 快速开发整合包1.4 三者关系总结二、配置文件核心知识点2.1 配置文件的作用 — 解决硬编码2.2 三类配置文件与优先级2.3 properties 配置详解2.3.1 基础语法2.3.2 使用 Value 读取配置2.3.3 properties 的核心缺点2.4 ymlYAML配置详解2.4.1 基础语法2.4.2 字符串单/双引号规则易错点2.4.3 使用 ConfigurationProperties 批量绑定2.4.4 yml 优缺点总结三、整体总结3.1 开发选型建议3.2 依赖关系速记3.3 配置读取方式全文总结核心知识点复盘常见问题 / 避坑指南本文基于 Spring Boot 项目实战代码系统梳理 Spring 生态核心概念与配置文件使用技巧适合 Spring 初学者系统学习及有经验的开发者复盘巩固。一、Spring、Spring Boot、Spring MVC 核心关系与区别对于刚接触 Spring 生态的开发者来说Spring、Spring MVC、Spring Boot 这三个名词经常同时出现很容易混淆。本节从定位和职责两个维度帮你理清三者的关系。1.1 Spring — 企业级开发的基石Spring 是一个轻量级、一站式、模块化的企业级开发框架。它的核心价值在于管理对象及其依赖关系——也就是我们常说的IoC控制反转和DI依赖注入。在真实的 Spring 项目中你只需通过注解声明依赖关系容器会自动完成对象的创建和注入。Spring 的核心能力一览能力说明IoC / DI管理对象的创建和依赖关系AOP面向切面编程统一处理日志、事务等横切关注点事务管理声明式事务简化数据库操作数据访问整合 JDBC、ORM 框架Web 支持提供 Spring MVC 子框架Spring 的另一大优势是高开放性不强制绑定全套组件可以按需选用模块也能无缝整合 Hibernate、Struts 等第三方框架。1.2 Spring MVC — Web 层子框架Spring MVC 是 Spring 原生的 Web 子框架专注于 Web 应用与 RESTful 接口开发。它依托 Spring 内核构建天然与 Spring 容器无缝集成。核心能力包括URL 与控制器灵活映射通过RequestMapping、GetMapping等注解将 HTTP 请求映射到 Java 方法约定大于配置减少 XML 配置通过注解驱动开发下面是一个典型的 Spring MVC 控制器示例packagecom.zmt.springioc.controller;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;RequestMapping(/prop)// 类级别映射所有方法路径前缀为 /propRestController// Controller ResponseBody返回 JSON/文本publicclassPropertiesController{Value(${spring.datasource.url})privateStringurl;// 从配置文件注入数据库连接地址Value(${my.key1})privateIntegerkey1;// Spring 自动进行类型转换 String → IntegerValue(${my.key2})privateBooleankey2;// 自动类型转换 String → BooleanRequestMapping(/read)// 方法级别映射访问 /prop/read 时触发publicStringreadProperties(){return从配置文件中读取 url:url\n key1:key1\n key2:key2;}}关键点RestController是ControllerResponseBody的组合注解表示该类中所有方法的返回值直接写入 HTTP 响应体而不是跳转到视图页面。这是 RESTful API 开发中最常用的注解。1.3 Spring Boot — 快速开发整合包Spring Boot 是 Spring 的封装整合工具核心目标是简化项目搭建与配置。它的定位是脚手架——帮你快速搭好项目骨架让你专注于业务逻辑。Spring Boot 的工作逻辑它本身不完成 Web 或数据库业务而是帮你自动整合所需的模块。做 Web 开发就引入spring-boot-starter-webmvc做数据库操作就引入 MyBatis 或 JPA 的 Starter。以项目中的pom.xml为例!-- Spring Boot 项目只需引入 Starter自动传递所需依赖 --dependencies!-- Web MVC Starter内含 Spring MVC、内嵌 Tomcat 等 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-webmvc/artifactId/dependency!-- Lombok简化 Java Bean 代码 --dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency/dependencies再看启动类一个注解就能启动整个应用packagecom.zmt.springioc;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ConfigurableApplicationContext;SpringBootApplication// 核心注解涵盖 Configuration、EnableAutoConfiguration、ComponentScanpublicclassSpringIoCApplication{publicstaticvoidmain(String[]args){// run() 返回的是 Spring IoC 容器上下文可以从中获取任何被管理的 BeanConfigurableApplicationContextcontextSpringApplication.run(SpringIoCApplication.class,args);// 从容器中按名称获取 BeanUserControllerbean(UserController)context.getBean(userController);bean.hello();}}SpringBootApplication深入理解这是一个组合注解等价于同时标注了Configuration声明配置类、EnableAutoConfiguration启用自动配置和ComponentScan组件扫描。一个注解完成三件事这就是 Spring Boot 的约定大于配置哲学。Spring Boot 的亮点内嵌 Web 服务器Tomcat/Jetty无需部署 WAR 包直接java -jar运行Starter 依赖一键引入技术栈自动处理版本兼容自动配置根据类路径中的依赖自动配置 Spring 应用1.4 三者关系总结用一句话概括三者的关系Spring MVC 和 Spring Boot 都隶属于 Spring 生态。Spring MVC 是 Spring 下的 MVC Web 子框架Spring Boot 是基于 Spring 的快速开发整合包。Spring Boot 内置了 Spring MVC做 Web 开发无需额外引入 MVC 依赖开箱即用。二、配置文件核心知识点2.1 配置文件的作用 — 解决硬编码在了解配置文件之前先看一个问题硬编码。硬编码就是将可变数据直接写在源代码中。比如数据库连接地址// 硬编码 — 不推荐Stringurljdbc:mysql://127.0.0.1:3306/testdb;Stringusernameroot;Stringpasswordroot;这样做的问题很明显数据库地址变了必须改代码、重新编译、重新部署不同环境开发/测试/生产需要维护多套代码密码写在代码里安全性极差配置文件的核心目的将所有可变配置集中存放程序启动时自动读取。这就像手机的字体大小设置——如果写死在代码里所有人的字体都一样大放入配置文件后每个用户可以根据自己的偏好调整。Spring Boot 项目启动时会自动加载application.properties或application.yml开发者只需在代码中通过注解读取即可。2.2 三类配置文件与优先级Spring Boot 支持三种配置文件格式格式说明application.propertiesSpring Boot 默认配置文件keyvalue 格式application.ymlYAML 格式树形层级结构application.yaml与.yml完全等价就像.html与.htm的关系优先级规则当同一个配置项在 properties 和 yml 中同时存在时properties 的优先级高于 yml最终生效以 properties 中的值为准。这一机制常用于运维场景——用 properties 临时覆盖某些配置而不改动 yml 主文件。2.3 properties 配置详解2.3.1 基础语法properties 采用纯keyvalue键值对格式#用于单行注释。以下为项目中的实际配置# Spring-IoC 项目 application.properties # 应用名称 spring.application.nameSpring-IoC # 服务器端口 server.port9090 # MySQL 数据库连接配置 spring.datasource.urljdbc:mysql://127.0.0.1:3306/testdb spring.datasource.usernameroot spring.datasource.passwordroot # 自定义配置项 my.key15 my.key2true2.3.2 使用 Value 读取配置在代码中通过Value(${配置key})注解将配置值注入到 Java 类属性中。Spring 会自动进行类型转换——字符串5转为Integertrue转为Booleanpackagecom.zmt.springioc.controller;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;RequestMapping(/prop)RestControllerpublicclassPropertiesController{Value(${spring.datasource.url})privateStringurl;// 注入数据库连接地址Value(${my.key1})privateIntegerkey1;// 5 → Integer 类型自动转换Value(${my.key2})privateBooleankey2;// true → Boolean 类型自动转换RequestMapping(/read)publicStringreadProperties(){return从配置文件中读取 url:url\n key1:key1\n key2:key2;}}启动项目后访问http://localhost:9090/prop/read即可看到从配置文件注入的值。Spring 在启动时会扫描Value注解从配置文件中读取对应的值并注入。2.3.3 properties 的核心缺点仔细看上面的数据库配置spring.datasource这个前缀重复了 3 次。在实际项目中可能有几十条相关配置大量重复前缀会让文件变得臃肿、可读性下降# 冗余示例 — 相同前缀反复出现 spring.datasource.url... spring.datasource.username... spring.datasource.password... spring.datasource.driver-class-name... spring.datasource.hikari.maximum-pool-size... # ... 更多重复前缀 ...YAML 正是为解决这个冗余问题而生。2.4 ymlYAML配置详解2.4.1 基础语法YAML 全称Yet Another Markup Language另一种标记语言采用树形层级结构通过缩进表达父子关系。基本格式为key: value。⚠️强制规则冒号后面必须跟一个英文空格。key:value无空格会被判定为语法错误导致项目启动失败。这也是 YAML 配置中最常见的踩坑点。以下为项目中的 yml 配置# Spring-IoC 项目 application.yml # 自定义 keyyaml:aa# 数据库配置 — 层级结构无需重复前缀spring:datasource:url:jdbc:mysql://127.0.0.1:3306/testdbusername:rootpassword:root# 字符串转义测试string:str1:Hello \n Spring Boot.# 默认字符串\n 作为普通文本str2:Hello \n Spring Boot.# 单引号\n 不转义原样输出str3:Hello \n Spring Boot.# 双引号\n 会被解析为换行符# 对象配置student:id:1name:Javaage:18# 集合与 Map 配置dbtypes:name:# List 集合-mysql-sqlserver-db2map:# Map 键值对k1:kk1k2:kk2k3:kk3与 properties 对比同样的数据库配置在 yml 中只需要写一次spring.datasource子配置通过缩进排列一目了然。2.4.2 字符串单/双引号规则易错点这是 YAML 配置中极易混淆的细节。项目中专门设置了三个测试值来验证string:str1:Hello \n Spring Boot.# 无引号 — 与单引号行为一致str2:Hello \n Spring Boot.# 单引号 — 转义字符原样输出str3:Hello \n Spring Boot.# 双引号 — 转义字符正常转义通过YamlController读取并打印RequestMapping(/yaml)RestControllerpublicclassYamlController{Value(${string.str1})privateStringstr1;// 输出Hello \n Spring Boot. \n 未转义Value(${string.str2})privateStringstr2;// 输出Hello \n Spring Boot. 单引号\n 原样Value(${string.str3})privateStringstr3;// 输出Hello 换行Spring Boot. 双引号\n 转义为换行RequestMapping(/read)publicStringread(){System.out.println(str1);System.out.println(str2);System.out.println(str3);returnsuccess;}}规则总结写法效果字符串或字符串转义字符\n、\t等不生效作为普通文本输出字符串转义字符正常生效\n→ 换行\t→ 制表符实践建议大多数场景下无需加引号。当你确实需要在配置值中使用\n换行等转义字符时使用双引号包裹。2.4.3 使用 ConfigurationProperties 批量绑定除了Value逐条读取Spring Boot 还提供了ConfigurationProperties注解支持按前缀批量绑定配置到 Java 对象非常适合层级化的 yml 配置。示例一绑定对象packagecom.zmt.springioc.config;importlombok.Data;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.context.annotation.Configuration;DataConfiguration// 声明为 Spring 配置类ConfigurationProperties(prefixstudent)// 绑定 yml 中 student 前缀下的所有配置publicclassStudent{privateIntegerid;// student.id → 1privateStringname;// student.name → JavaprivateIntegerage;// student.age → 18}示例二绑定 List 和 Mappackagecom.zmt.springioc.config;importlombok.Data;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.context.annotation.Configuration;importjava.util.List;importjava.util.Map;DataConfigurationConfigurationProperties(prefixdbtypes)publicclassDbTypeConfig{privateListStringname;// 绑定 name 列表[mysql, sqlserver, db2]privateMapString,Stringmap;// 绑定 map 键值对{k1kk1, k2kk2, k3kk3}}示例三嵌套对象绑定来自 captch-demo 项目// CaptchaProperties.java — 主配置类packagecom.zmt.captchdemo.model;importlombok.Data;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.context.annotation.Configuration;DataConfigurationConfigurationProperties(prefixcaptcha)publicclassCaptchaProperties{privateIntegerwidth;// captcha.width → 150privateIntegerheight;// captcha.height → 60privateSessionsession;// captcha.session → 嵌套对象自动绑定}// Session.java — 嵌套对象packagecom.zmt.captchdemo.model;importlombok.Data;DatapublicclassSession{privateStringcode;// captcha.session.code → codeprivateStringdate;// captcha.session.date → date}对应的 yml 配置captcha:width:150height:60session:code:codedate:dateValuevsConfigurationProperties对比维度ValueConfigurationProperties读取方式逐条指定完整 key按前缀批量绑定适用场景少量配置、简单值层级配置、批量绑定类型安全需手动转换自动类型映射松散绑定不支持支持my-key↔myKey建议当某个前缀下有 ≥ 3 条配置时优先使用ConfigurationProperties代码更简洁、更易维护。2.4.4 yml 优缺点总结✅优点层级清晰、可读性高彻底解决 properties 的冗余前缀问题原生支持对象、List、Map 等多种数据类型无需额外解析跨语言通用Java、Python、Go、JavaScript 等主流语言均可使用❌缺点不适合超大型、极其复杂的配置场景此时可考虑外部配置中心如 Nacos、Apollo对缩进和空格格式要求极高——一个缩进错误直接导致项目启动失败排查起来比 properties 更费时三、整体总结3.1 开发选型建议日常 Spring Boot 项目优先推荐使用 yml 配置文件。它的层级结构清晰、无冗余前缀写起来简洁、读起来直观。仅以下两种情况可继续使用 properties遗留老项目改造 yml 成本大于收益极简小项目只有三五条配置yml 层级的优势体现不出来3.2 依赖关系速记Spring Boot 内置了 Spring MVC引入spring-boot-starter-webmvc后即可直接编写 Controller无需额外配置。Spring Boot 是壳Spring MVC 是Web 引擎Spring 是底层核心——三者是层层包含的关系。3.3 配置读取方式两种配置文件都支持Value(${key})逐条读取。Spring Boot 额外提供ConfigurationProperties(prefix xxx)支持按前缀批量绑定配合 yml 的层级结构使用效果最佳。全文总结本文从 Spring 生态的三大核心概念出发逐步深入到配置文件的使用细节核心内容回顾Spring的核心是 IoC 容器——将对象创建和依赖管理从代码中剥离实现高内聚低耦合Spring MVC是 Web 层子框架依托 Spring 内核通过注解驱动简化 Web 开发Spring Boot是快速开发整合包通过自动配置和 Starter 依赖大幅降低项目搭建成本配置文件是解决硬编码的关键手段properties 和 yml 各有适用场景yml凭借层级结构和丰富的数据类型支持成为现代 Spring Boot 项目的首选配置格式核心知识点复盘知识点关键内容IoC / DI控制反转对象创建由容器管理依赖注入依赖从外部注入而非内部 newSpringBootApplication组合注解 ConfigurationEnableAutoConfigurationComponentScanRestControllerControllerResponseBodyRESTful 接口开发标配Value(${key})逐条读取配置支持自动类型转换ConfigurationProperties按前缀批量绑定适合层级化配置yml 空格规则key: value冒号后必须有空格否则语法错误yml 引号规则单引号/无引号不转义特殊字符双引号转义特殊字符配置文件优先级properties yml yaml同名配置下常见问题 / 避坑指南1. yml 缩进报错导致项目启动失败确保缩进统一使用空格不要混用 Tab冒号后必须有空格。IDE 会给出语法高亮提示启动前先检查 yml 文件是否有红色波浪线。2.Value注入的值为 null检查 key 是否写错确认配置文件是否在src/main/resources目录下。另外Value不能注入到static字段中——静态字段在类加载时就确定了而 Spring 的依赖注入发生在对象实例化阶段。3.ConfigurationProperties不生效确保类上同时标注了Configuration或Component和ConfigurationProperties。如果 IDE 提示 “Spring Boot Configuration Annotation Processor not configured”可以在pom.xml中添加spring-boot-configuration-processor依赖以启用自动补全。4. properties 和 yml 同时存在哪个生效properties 优先级更高。如果你在 yml 中配置了server.port8080但在 properties 中配置了server.port9090最终生效的端口是9090。这个特性可用于临时覆盖配置但日常开发建议只保留一种格式避免混淆。5. yml 中如何写多行字符串使用|保留换行或折叠换行为空格符号description:|这是第一行 这是第二行6. 配置文件中的敏感信息如何处理数据库密码等敏感信息不应明文写在配置文件中。生产环境建议使用环境变量、JVM 参数-Dspring.datasource.passwordxxx或专业的配置中心如 Nacos、Spring Cloud Config来管理敏感配置。本文基于 Spring Boot 4.1.0 实战项目编写所有代码均可直接运行验证。希望这篇文章能帮助你建立对 Spring 生态和配置文件的系统性认知。