
本节目标
-
学习SpringBoot配置文件的格式以及对应的语法
-
了解两个配置文件格式的差异
1. 配置文件作用
配置文件主要用于解决硬编码问题:将可能发生变化的信息集中管理,程序启动时读取配置加载运行,避免把参数直接写死在代码中。
SpringBoot 配置文件承载了项目的核心配置信息,常见用途包括:
-
项目启动端口号
-
数据库连接信息(地址、用户名、密码)
-
第三方系统调用密钥
-
日志的输出规则与持久化配置
典型场景说明
-
端口配置:SpringBoot 内置 Tomcat 默认端口为 8080,若端口被占用,可通过配置文件自定义端口。
-
数据库配置:持久层框架需要读取配置中的数据库连接信息,适配不同环境的数据库。
2. 配置文件快速入手
SpringBoot 项目创建时默认生成 application.properties 配置文件,可直接修改配置。
示例:修改服务启动端口
properties
# application.properties
server.port=9090
重启项目后,Tomcat 将以 9090 端口启动,原 8080 端口失效。
3. 配置文件的格式
SpringBoot 支持三种配置文件,启动时会自动从 classpath 下加载:
-
application.properties -
application.yml
application.yaml
yml是yaml的简写,二者语法完全一致,实际开发中 yml 使用频率最高。
格式共存规则
-
理论上 properties 和 yml 可以同时存在于项目中,两份配置都会被加载。
-
若两个文件的配置项发生冲突,以 properties 为准,properties 优先级更高。
-
实际项目建议统一使用同一种配置格式,降低维护成本。
4. properties 配置文件说明
properties 是 SpringBoot 项目默认的配置文件格式,属于早期标准配置格式。
4.1 基本语法
以 key=value 键值对形式配置,使用 # 添加注释。
properties
# 配置项目端口号
server.port=8080
# 配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
4.2 读取配置文件
使用 @Value 注解配合 ${key} 格式,可在代码中读取配置项。
配置示例:
properties
mykey.key1 = bite
代码读取示例:
从配置文件中获取值
java
@RestController
@RequestMapping("proper")
public class PropertiesController {
@Value("${my.key}")
private String myKey;
@GetMapping("/getConfigValue")
public String getConfigValue() {
return "从配置中获取值myKey="+myKey;
}
}
properties
spring.application.name=Spring-ioc-demo1
server.port=9090
my.key=hello world
- yml 文件获取方式一致
4.3 properties 缺点
层级配置会产生大量冗余前缀,例如数据库配置需要重复书写 spring.datasource 前缀,配置繁琐且可读性差。
5. yml 配置文件说明
YAML(Yet Another Markup Language)是一种树形结构的标记语言,yml 是其简写形式。
5.1 基本语法
-
基础格式:
key: value,英文冒号后必须加一个空格,空格不可省略 -
层级通过换行+缩进表示,结构清晰
数据库配置示例:
yaml
spring:
datasource:
url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=false
username: root
password: root
相比 properties 格式,消除了重复前缀,更简洁易读。
5.2 yml 使用进阶
5.2.1 配置不同数据类型及 null
yaml
# 字符串
string.value: Hello
# 布尔值
boolean.value: true
boolean.value1: false
# 整数
int.value: 10
# 浮点数
float.value: 3.14159
# Null,~ 代表 null
null.value: ~
# 空字符串
empty.value: ''
yml 配置读取
基础配置项同样使用 @Value 注解读取,用法与 properties 一致。
配置示例:
yaml
string:
hello: bite
代码读取示例:
java
@RestController
public class ReadYml {
@Value("${string.hello}")
private String hello;
@RequestMapping("/ymlKey")
public String key(){
return "读取到值:" + hello;
}
}
字符串单双引号注意事项
字符串默认无需加引号,单双引号对特殊字符的处理逻辑不同:
-
不加引号:特殊字符会被当作普通文本处理
-
单引号:会转义特殊字符,使其失去特殊含义,始终作为普通字符串
-
双引号 :不会转义特殊字符,保留字符本身的含义(例如
\n会表示换行)
示例:
yaml
string:
str1: Hello \n Spring Boot.
str2: 'Hello \n Spring Boot.'
str3: "Hello \n Spring Boot."
-
str1 和 str2 中
\n会作为普通字符输出 -
str3 中
\n会作为换行符生效
5.2.2 配置对象
yml 支持直接配置对象,有两种写法:
分层写法
yaml
student:
id: 1
name: Java
age: 18
行内写法(效果等价)
yaml
student: {id: 1, name: Java, age: 18}
对象类型无法用 @Value 读取,需使用 @ConfigurationProperties 注解,配合实体类接收:
java
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
private int id;
private String name;
private int age;
}
使用时直接注入对象:
java
@RestController
public class StudentController {
@Autowired
private Student student;
@RequestMapping("/readStudent")
public String readStudent(){
return student.toString();
}
}
5.2.3 配置集合
yml 可配置 List 集合:
yaml
dbtypes:
name:
- mysql
- sqlserver
- db2
同样使用 @ConfigurationProperties 读取:
java
@Component
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {
private List<String> name;
}
5.2.4 配置 Map
yml 可配置 Map 集合,支持两种写法:
分层写法
yaml
maptypes:
map:
k1: kk1
k2: kk2
k3: kk3
行内写法(效果等价)
yaml
maptypes: {map: {k1: kk1, k2: kk2, k3: kk3}}
使用 @ConfigurationProperties 读取:
java
@Component
@ConfigurationProperties("maptypes")
@Data
public class MapConfig {
private HashMap<String,String> map;
}
5.3 yml 优缺点
优点
-
可读性高,写法简洁,层级结构清晰易理解
-
支持丰富的数据类型,可便捷表达对象、数组、List、Map 等结构
- 跨语言通用,不仅 Java,Golang、Python、JavaScript 等语言均可使用
缺点
-
过于复杂的配置用 yml 表达后可读性反而下降,编写和转换成本高
-
格式要求极其严格,空格缩进错误会直接导致配置失效
6. 综合性练习:验证码案例
使用 Hutool 工具库实现图形验证码功能,包含生成验证码、校验验证码两个核心能力。
6.1 需求说明
-
页面展示图形验证码
-
用户输入验证码后提交,后端校验是否正确,校验成功则跳转页面
6.2 前后端交互接口
接口1:生成验证码
-
请求URL:
/captcha/getCaptcha -
响应:验证码图片流,浏览器直接展示图片
接口2:校验验证码
-
请求URL:
/captcha/check -
请求参数:
captcha(用户输入的验证码字符串) -
响应:布尔值,
true表示验证成功,false表示验证失败
6.3 Hutool 工具介绍
Hutool 是一款 Java 工具类库,封装了文件、加密、正则、验证码等常用能力,通过静态方法降低 API 使用成本。
6.4 服务端实现
步骤1:引入依赖
xml
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-captcha</artifactId>
<version>5.8.43</version>
</dependency>
步骤2:配置项抽离
将验证码参数写入 yml 配置文件:
yaml
captcha:
width: 100
height: 40
session:
key: CAPTCHA_SESSION_KEY
date: KAPTCHA_SESSION_DATE
创建配置属性类接收配置:
java
@Data
@Component
@ConfigurationProperties(prefix = "captcha")
public class CaptchaProperties {
private Integer width;
private Integer height;
private Session session;
@Data
public static class Session {
private String key;
private String date;
}
}
步骤3:生成验证码接口
java
@RequestMapping("/captcha")
@RestController
public class HuToolCaptchaController {
@Autowired
private CaptchaProperties captchaProperties;
@RequestMapping("/getCaptcha")
public void getCode(HttpSession session, HttpServletResponse response) {
// 生成指定尺寸的线条验证码
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(
captchaProperties.getWidth(),
captchaProperties.getHeight()
);
response.setContentType("image/jpeg");
response.setHeader("Pragma", "No-cache");
try {
// 输出图片到响应流
lineCaptcha.write(response.getOutputStream());
// 将验证码和生成时间存入 Session
session.setAttribute(captchaProperties.getSession().getKey(), lineCaptcha.getCode());
session.setAttribute(captchaProperties.getSession().getDate(), new Date());
response.getOutputStream().close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
步骤4:校验验证码接口
java
// 验证码有效期:1分钟
private final static long VALID_MILLIS_TIME = 60 * 1000;
@RequestMapping("/check")
public boolean checkHomeCaptcha(String captcha, HttpSession session) {
// 空参数直接返回失败
if (!StringUtils.hasLength(captcha)) {
return false;
}
// 从 Session 取出保存的验证码和生成时间
String savedCaptcha = (String) session.getAttribute(captchaProperties.getSession().getKey());
Date sessionDate = (Date) session.getAttribute(captchaProperties.getSession().getDate());
// 忽略大小写比对,且校验有效期
if (captcha.equalsIgnoreCase(savedCaptcha)) {
if (sessionDate == null
|| System.currentTimeMillis() - sessionDate.getTime() < VALID_MILLIS_TIME) {
return true;
}
}
return false;
}
🌟关系图
验证码示例
yml
captcha:
width: 200
height: 100
session:
code: captchaCode
date: captchaDate
引用关系见图

主要有@ConfigurationProperties(prefix = "captcha"),才能获取到值
6.5 前端页面调整
通过 Ajax 提交验证码进行校验,成功则跳转页面:
javascript
$("#checkCaptcha").click(function () {
$.ajax({
url: "/captcha/check",
type: "post",
data: { captcha: $("#inputCaptcha").val() },
success: function (result) {
if (result) {
location.href = "success.html";
} else {
alert("验证码错误");
$("#inputCaptcha").val("");
}
}
});
});
7. 总结
-
properties 采用
key=value的键值对格式,yml 采用树形缩进的层级格式。 -
读取单个配置项使用
@Value注解,格式为${配置key}。
-
yml 层级通过换行缩进区分,
key: value中冒号后的空格不可省略。 -
properties 是默认配置格式,存在冗余前缀问题;yml 更简洁,支持复杂数据类型,但不适合超复杂配置。
-
properties 与 yml 可共存,但优先级以 properties 为准,项目中建议统一使用一种格式。
-
properties和yml配置冲突时,以properties为准