SpringBoot 配置文件

SpringBoot 的核心特性之一是自动配置,而配置文件是定制化自动配置的核心入口。本文结合实操代码,详细讲解 SpringBoot 配置文件的类型、语法、数据绑定等核心知识点。

一、配置文件基础

1. 配置文件类型

SpringBoot 支持两种主流配置文件格式,默认放置在src/main/resources目录下:

  • .properties:键值对格式,语法简单但不支持复杂数据结构;
  • .yaml/.yml:层级化格式,支持复杂数据结构(列表、对象、映射),可读性更强。

优先级:.properties > .yml(同目录下两者共存时,.properties会覆盖.yml的相同配置)。

2. 核心配置示例(基础属性)

(1) .properties 示例

properties

复制代码
# 配置服务器端口(注释用#开头)
server.port=8085
# 配置应用名称
spring.application.name=demo09
(2) .yml 示例

yaml

复制代码
# 层级化配置,注意:冒号后必须加空格,缩进用2个空格(禁止tab)
server:
  port: 8080  # 服务器端口
spring:
  application:
    name: demo09  # 应用名称

二、YAML 语法详解(重点)

YAML 是 SpringBoot 推荐的配置格式,支持标量、列表、映射、对象等复杂结构,以下结合实操代码讲解:

1. 标量(单个值)

支持字符串、数字、布尔值、日期等,示例:

yaml

复制代码
person:
  id: 1                # 整数
  name: '张三\n李四'   # 字符串(单引号会转义特殊字符,双引号不转义)
  address: 河北        # 字符串(无需引号)
  isGlass: true        # 布尔值
  birthday: 2025/1/5   # 日期(SpringBoot自动解析为java.util.Date)

2. 列表(数组)

语法:key: [元素1, 元素2,...] 或换行缩进格式:

yaml

复制代码
person:
  # 行内式列表
  hobbies: [乒乓球,篮球,足球]
  # 换行式列表(推荐,可读性更强)
  # hobbies:
  #   - 乒乓球
  #   - 篮球
  #   - 足球

3. 映射(键值对)

语法:key: {k1: v1, k2: v2} 或换行缩进格式:

yaml

复制代码
person:
  # 行内式映射
  maps: {k1: value1,k2: value2}
  # 换行式映射
  # maps:
  #   k1: value1
  #   k2: value2

4. 嵌套对象

配置自定义对象(如Dog),需保证对象属性与配置层级匹配:

yaml

复制代码
person:
  dog:  # 嵌套Dog对象
    age: 5
    name: 旺财

三、配置文件与 JavaBean 绑定(核心实操)

SpringBoot 支持将配置文件中的属性绑定到 JavaBean 中,主要有两种方式:@Value@ConfigurationProperties

1. 准备工作:定义 JavaBean

(1) 定义 Dog 类

java

运行

复制代码
package com.qcby.model;

import org.springframework.stereotype.Component;

@Component // 交给Spring容器管理
public class Dog {
    private Integer age;
    private String name;

    // 无参构造(必须,Spring反射创建对象需要)
    public Dog() {}

    // 有参构造、getter/setter、toString(省略,需手动补充)
    public Integer getAge() { return age; }
    public void setAge(Integer age) { this.age = age; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    @Override
    public String toString() {
        return "Dog{age=" + age + ", name='" + name + "'}";
    }
}
(2) 定义 Person 类

java

运行

复制代码
package com.qcby.model;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Component // 交给Spring容器管理
@ConfigurationProperties(prefix = "person") // 绑定配置文件中以person开头的属性
public class Person {
    // 方式1:@Value逐个绑定(适合简单属性)
    @Value("${person.id}")
    private Integer id;
    @Value("${person.name}")
    private String name;
    @Value("${person.address}")
    private String address;
    @Value("${person.isGlass}")
    private boolean isGlass;
    @Value("${person.birthday}")
    private Date birthday;

    // 方式2:@ConfigurationProperties批量绑定(适合复杂属性,无需逐个注解)
    private List<String> hobbies; // 列表
    private Map<String, String> maps; // 映射
    private Dog dog; // 嵌套对象
    private List<Dog> dogs; // 对象列表

    // 无参构造、getter/setter、toString(必须补充,否则绑定失败)
    public Person() {}

    // getter/setter 示例(其余属性同理)
    public List<String> getHobbies() { return hobbies; }
    public void setHobbies(List<String> hobbies) { this.hobbies = hobbies; }
    public Map<String, String> getMaps() { return maps; }
    public void setMaps(Map<String, String> maps) { this.maps = maps; }
    public Dog getDog() { return dog; }
    public void setDog(Dog dog) { this.dog = dog; }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", isGlass=" + isGlass +
                ", birthday=" + birthday +
                ", hobbies=" + hobbies +
                ", maps=" + maps +
                ", dog=" + dog +
                ", dogs=" + dogs +
                '}';
    }
}

2. 两种绑定方式对比

特性 @Value @ConfigurationProperties
绑定方式 逐个属性绑定 批量绑定(指定前缀)
支持复杂类型 不支持(列表 / 对象 / 映射) 支持(自动解析)
松散绑定 不支持 支持(如person.isGlass可绑定isGlass
数据类型转换 基础类型转换 自动转换(如字符串转 Date/List)
校验(JSR303) 不支持 支持(配合@Validated

3. 依赖支持(可选)

为了让@ConfigurationProperties有更好的提示,需引入配置处理器依赖:

xml

复制代码
<!-- pom.xml中添加 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

四、测试配置绑定效果

1. 编写 Controller 测试

java

运行

复制代码
package com.qcby.controller;

import com.qcby.model.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController // 等同于@Controller + @ResponseBody
@RequestMapping("/hello")
public class HelloController {

    @Autowired // 注入绑定好的Person对象
    private Person person;

    @RequestMapping("/say")
    public String hello() {
        // 打印Person对象,查看配置绑定结果
        System.out.println(person);
        return "配置绑定成功!控制台查看详情";
    }
}

2. 启动 SpringBoot 主类

java

运行

复制代码
package com.qcby;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication // 核心注解:自动配置+组件扫描+配置类
public class Demo09Application {
    public static void main(String[] args) {
        // 启动SpringBoot应用
        SpringApplication.run(Demo09Application.class, args);
    }
}

3. 访问测试

启动应用后,访问http://localhost:8080/hello/say,控制台输出如下(示例):

plaintext

复制代码
Person{id=1, name='张三
李四', address='河北', isGlass=true, birthday=Sun Jan 05 00:00:00 CST 2025, hobbies=[乒乓球, 篮球, 足球], maps={k1=value1, k2=value2}, dog=Dog{age=5, name='旺财'}, dogs=null}

五、常见问题与注意事项

1. YAML 语法错误

  • 冒号后必须加空格(如port:8080错误,port: 8080正确);
  • 缩进必须用 2 个空格,禁止使用 tab;
  • 字符串单引号会转义特殊字符(如'张三\n李四'输出张三\n李四),双引号不转义(如"张三\n李四"输出换行)。

2. 配置绑定失败

  • JavaBean 必须有无参构造(Spring 反射创建对象的前提);
  • 必须提供 getter/setter(@ConfigurationProperties通过 setter 赋值);
  • @Component注解不能少(保证 Bean 被 Spring 容器管理);
  • @ConfigurationPropertiesprefix必须与配置文件中的前缀一致(如prefix = "person"对应person.xxx)。

3. 端口冲突

若启动时报Address already in use,修改server.port为未被占用的端口(如 8081、8082)。

六、总结

  1. SpringBoot 配置文件优先推荐yml格式,支持复杂数据结构;
  2. @Value适合简单属性绑定,@ConfigurationProperties适合复杂场景;
  3. 配置绑定的核心是:JavaBean 的属性名与配置文件层级匹配,且 Bean 被 Spring 管理;
  4. 配置处理器依赖可提升开发体验,建议必加。

通过以上配置方式,可灵活定制 SpringBoot 应用的属性,实现从配置文件到 Java 代码的无缝绑定。

相关推荐
江君是实在人2 小时前
java jvm 调优
java·开发语言·jvm
阿崽meitoufa2 小时前
JVM虚拟机:垃圾收集算法
java·jvm·算法
数电发票API2 小时前
线上充值自动开票攻略:四步落地,告别人工低效内耗
java
想用offer打牌2 小时前
Spring AI vs Spring AI Alibaba
java·人工智能·后端·spring·系统架构
顾北122 小时前
Java接入阿里百炼大模型实战指南
java·ai
毕设源码-郭学长2 小时前
【开题答辩全过程】以 高校水电表缴费系统的设计与实现为例,包含答辩的问题和答案
java
win x2 小时前
网络通信协议 第一部
java·网络协议
guslegend2 小时前
第6章:SpringBoot 拦截器-监听器实战
spring boot
黎雁·泠崖3 小时前
Java面向对象:对象数组进阶实战
java·开发语言