【SpringBoot配置文件】

本节目标

  1. 学习SpringBoot配置文件的格式以及对应的语法

  2. 了解两个配置文件格式的差异

1. 配置文件作用

配置文件主要用于解决硬编码问题:将可能发生变化的信息集中管理,程序启动时读取配置加载运行,避免把参数直接写死在代码中。

SpringBoot 配置文件承载了项目的核心配置信息,常见用途包括:

  • 项目启动端口号

  • 数据库连接信息(地址、用户名、密码)

  • 第三方系统调用密钥

  • 日志的输出规则与持久化配置

典型场景说明

  • 端口配置:SpringBoot 内置 Tomcat 默认端口为 8080,若端口被占用,可通过配置文件自定义端口。

  • 数据库配置:持久层框架需要读取配置中的数据库连接信息,适配不同环境的数据库。

2. 配置文件快速入手

SpringBoot 项目创建时默认生成 application.properties 配置文件,可直接修改配置。

示例:修改服务启动端口

properties 复制代码
# application.properties
server.port=9090

重启项目后,Tomcat 将以 9090 端口启动,原 8080 端口失效。

3. 配置文件的格式

SpringBoot 支持三种配置文件,启动时会自动从 classpath 下加载:

  1. application.properties

  2. application.yml

  1. application.yaml

ymlyaml 的简写,二者语法完全一致,实际开发中 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 优缺点

优点

  1. 可读性高,写法简洁,层级结构清晰易理解

  2. 支持丰富的数据类型,可便捷表达对象、数组、List、Map 等结构

  1. 跨语言通用,不仅 Java,Golang、Python、JavaScript 等语言均可使用

缺点

  1. 过于复杂的配置用 yml 表达后可读性反而下降,编写和转换成本高

  2. 格式要求极其严格,空格缩进错误会直接导致配置失效

6. 综合性练习:验证码案例

使用 Hutool 工具库实现图形验证码功能,包含生成验证码、校验验证码两个核心能力。

6.1 需求说明

  1. 页面展示图形验证码

  2. 用户输入验证码后提交,后端校验是否正确,校验成功则跳转页面

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. 总结

  1. properties 采用 key=value 的键值对格式,yml 采用树形缩进的层级格式。

  2. 读取单个配置项使用 @Value 注解,格式为 ${配置key}

  1. yml 层级通过换行缩进区分,key: value 中冒号后的空格不可省略。

  2. properties 是默认配置格式,存在冗余前缀问题;yml 更简洁,支持复杂数据类型,但不适合超复杂配置。

  1. properties 与 yml 可共存,但优先级以 properties 为准,项目中建议统一使用一种格式。

  2. properties和yml配置冲突时,以properties为准

相关推荐
AOwhisky1 小时前
Python 学习笔记(第十四期)——运维自动化(下·中篇):远程文件传输——paramiko进阶篇
运维·python·学习·云原生·自动化·文件传输·paramiko
一缕清烟在人间1 小时前
HarmonyOS应用开发实战:萌宠日记 - 健康提醒列表与动态数据绑定
后端
HONG````1 小时前
HarmonyOS 6.1 实战:Stack 层叠布局与 Overlay 浮层详解
后端
做个文艺程序员1 小时前
Linux第22篇:用Docker容器化你的Java SaaS应用:一次构建,随处运行
java·docker·容器
math_hongfan1 小时前
鸿蒙Flutter setState机制深入理解
学习·flutter·华为·harmonyos·鸿蒙
其实防守也摸鱼2 小时前
补天SRC新手入门指南:从0到1的漏洞挖掘之路
网络·python·学习·安全·web安全·数据挖掘·挖洞
其美杰布-富贵-李2 小时前
Spring Boot 依赖注入说明文档
java·spring boot·python
tachibana22 小时前
hot100 数组中的第K个最大元素(215)
java·数据结构·算法·leetcode
our_times2 小时前
2026年Java开发者破局指南:Spring AI 2.0 与 Agent 开发实战
java·人工智能·spring