SpringBoot 配置文件核心用法(Properties & YAML)

SpringBoot 配置文件核心用法(Properties & YAML)

SpringBoot 配置文件作用

SpringBoot 定义了规范的配置文件格式,用于集成其他框架,并集中管理项目各类配置信息,典型场景包括:

  • 项目启动端口:自定义服务监听端口
  • 数据库连接信息:包含用户名、密码等
  • 第三方系统调用密钥
  • 日志配置:普通日志、异常日志,用于问题定位与排查

1.关键配置场景说明

  1. 项目启动端口
    • SpringBoot 内置 Tomcat 服务器,默认端口号为 8080
    • 若 8080 端口被其他程序占用,需通过配置文件自定义端口号
  2. 数据库连接信息
    • 持久层框架(如 MyBatis、JPA 等)是对 JDBC 的深层封装
    • 不同应用访问的数据库不同,需通过配置文件自定义数据库连接参数

2.配置文件快速入门

  • SpringBoot 项目创建时,会自动生成配置文件
  • 可通过修改配置文件,更改服务端口号(解决 8080 端口被占用问题)

修改 application.properties ⽂件

server.port=9090

显⽰Tomcat启动端⼝号为9090

访问程序:http://127.0.0.1:9090/login.html

此时:http://127.0.0.1:808/login.html 就不能再访问了

3.配置文件的格式

Spring Boot 配置文件有以下三种:

  • application.properties
  • application.yml
  • application.yaml

注意:

properties 优先级比yml. yaml的优先级要高一些

ymlyaml 的简写,实际开发中出现频率最高。yamlyml 的使用方式一样,课堂中只讲 yml 文件的使用。

当应用程序启动时,Spring Boot 会自动从 classpath 路径找到并加载 application.propertiesapplication.yaml 或者 application.yml 文件。

也可以通过 spring.config.name 指定文件路径和名称,参考 https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config.files

如下图所示:

3.1配置文件包装类比

类似商品包装,.properties老款包装(Spring Boot 项目默认格式),.yml新版包装,实际开发中更推荐使用。

3.2特殊说明

  1. 共存与优先级:理论上 .properties.yml 可共存,启动时都会加载;若配置冲突,.properties 优先级更高
  2. 实践建议:实际业务中建议统一使用一种格式,便于维护、降低故障概率。

注意事项:

重启idea ,会出现有一点小问题

我们重启idea我们会发现,他乱码了,遇到这种情况,我们没有恢复的办法

解决办法:

1.

2.

3.这个只是修改了这个的配置,我们需要修改整个的这个配置文件

4.修改本地的配置

4.properties 配置文件说明

4.1 基本语法
  • 格式:键值对key=value 形式
  • 注释:使用 # 添加注释

示例:

# 配置项目端口号 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} 格式读取

代码示例:

import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class PropertiesController { @Value("${mykey.key1}") private String key1; @RequestMapping("/key") public String key(){ return "读取到值:"+key1; } } 

配置示例:

mykey.key1 = bite 
补充说明
  • @Value 注解可直接注入配置文件中的值到类成员变量。
  • 访问 /key 接口时,会返回配置文件中 mykey.key1 对应的值(如 读取到值:bite)。

@PostConstruct 核心说明
1. 基本定义

@PostConstruct 是 Java EE 中的注解(Spring 也完全支持),作用是:在 Spring 容器创建完 Bean 实例、完成依赖注入后,自动执行标注了这个注解的方法

简单说:Bean 先被创建 → 依赖注入(比如 @Autowired 注入的对象)→ @PostConstruct 方法执行。

  •   初始化数据(比如加载配置、初始化缓存、连接第三方服务);
  • 执行 Bean 创建后的前置操作(依赖注入完成后才能执行,避免空指针)。
二、完整可运行示例
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; // 普通的Spring Bean @Component public class UserService { // 依赖注入的对象 @Autowired private ConfigService configService; // 空参、无返回值的初始化方法 @PostConstruct public void init() { // 此时configService已经完成注入,可安全使用 String config = configService.getConfig(); System.out.println("Bean初始化完成,加载配置:" + config); // 还可以做缓存初始化、数据预加载等操作 } } // 依赖的ConfigService(示例) @Component class ConfigService { public String getConfig() { return "数据库连接配置:jdbc:mysql://localhost:3306/test"; } } 
三、关键注意点
  1. 标注的方法必须是:无参数、无返回值(void)、非静态
  2. 执行时机:晚于 @Autowired 依赖注入,早于 Bean 被业务代码使用;
  3. 替代方案:Spring 的 InitializingBean 接口(但 @PostConstruct 更简洁)
4.3 properties 缺点分析

properties 配置是以key-value的形式配置的,如下图所⽰:

从上述配置key看出,properties配置⽂件中会有很多的冗余的信息,⽐如这些:

想要解决这个问题,就可以使⽤yml配置⽂件的格式化了.

5. yml 配置文件说明

yml 是 YAML 的缩写,它的全称是 Yet Another Markup Language,翻译成中文就是 “另一种标记语言”。我们先来学习 yml 的语法。

5.1 yml 基本语法

yml 是树形结构的配置文件,它的基础语法是 "key: value"

  • key 和 value 之间使用英文冒号加空格的方式组成,空格不可省略
  • 基础语法如下:
1. 基础键值对(核心语法)
# 正确写法(冒号后必须带空格) server: port: 8080 host: localhost # 错误写法(无空格,配置无法解析) # server:port:8080 
2. 数据类型
# 字符串(默认无需引号,特殊字符需加引号) name: 张三 nickname: "zhangsan:001" # 包含特殊符号时加双引号 remark: 'hello\nworld' # 单引号会转义特殊字符,\n 不会换行 # 数字 age: 20 score: 98.5 # 布尔值 enabled: true disabled: false # 空值 empty: null # 或 ~ # 日期(ISO 8601 格式) birthday: 2024-03-18 
3. 集合 / 数组(两种写法)
# 写法1:短横线 + 空格(推荐,层级清晰) user: hobbies: - 篮球 - 游泳 - 编程 # 写法2:中括号简写(单行) user: tags: [Java, SpringBoot, MySQL] 
4. 对象 / 嵌套配置
# 多层嵌套(SpringBoot 常用) spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test username: root password: 123456 redis: host: 127.0.0.1 port: 6379 timeout: 5000ms 
5. 注释规则
# 单行注释(仅支持单行,用 # 开头) server: port: 8080 # 端口配置(行内注释也需用 #) # 多行注释需每行加 # # 开发环境端口 # 生产环境可改为 80
使用 yml 连接数据库yml

使用示例:

spring: datasource: url: jdbc:mysql://127.0.0.1:3306/dbname?characterEncoding=utf8&useSSL=false username: root password: root 

yml 和 properties 连接数据库的配置对比:

5.2 yml 使用进阶

5.2.1 yml 配置不同数据类型及 null
# 字符串 string.value: Hello # 布尔值,true或false boolean.value: true boolean.value1: false # 整数 int.value: 10 # 浮点数 float.value: 3.14159 # Null,~代表null null.value: ~ # "" 空字符串 #,直接后面什么都不加就可以了,但这种方式不直观,更多的表示是使用引号括起来 empty.value: '' 
5.2.1.1 yml 配置读取

yml 读取配置的方式和 properties 相同,使用@Value注解即可,实现代码如下:

yml 配置:

string: hello: bite 

Java 代码:

@RestController public class ReadYml { @Value("${string.hello}") private String hello; @RequestMapping("/ymlKey") public String key(){ return "读取到值:"+hello; } } 

访问地址:http://127.0.0.1:8080/ymlKey

运行结果:(页面显示:读取到值:bite)

5.2.1.2 注意事项:value 值加单双引号

字符串默认不用加上单引号或者双引号,如果加英文的单双引号可以表示特殊的含义。

尝试在 application.yml 中配置如下信息:

string: str1: Hello \n Spring Boot. str2: 'Hello \n Spring Boot.' str3: "Hello \n Spring Boot." 

读取程序实现代码如下:

@RestController public class ReadYml { @Value("${string.str1}") private String str1; @Value("${string.str2}") private String str2; @Value("${string.str3}") private String str3; @RequestMapping("/yml") public String readYml(){ System.out.println(str1); System.out.println(str2); System.out.println(str3); return "yml"; } } 

以上程序的执行结果如下:

Hello \n Spring Boot. Hello \n Spring Boot. Hello Spring Boot. 

从上述结果可以看出:

  • 字符串默认不用加上单引号或者双引号。
  • 单引号会转义特殊字符,使其失去特殊功能,始终是一个普通的字符串。
  • 双引号不会转义字符串里面的特殊字符,特殊字符会表示本身的含义。

此处的转义理解起来会有些拗口,\n 本意表示的是换行:

  • 使用单引号会转义,\n 不再表示换行,而是表示一个普通的字符串。
  • 使用双引号不会转义,\n 表示的是它本身的含义,就是换行。
JavaEE 的学习重在理解和使用,不纠结概念和描述

想要快速赋值:value 

5.2.2 配置对象

我们还可以在 yml 中配置对象,如下配置:

student: id: 1 name: Java age: 18 

或者是使用行内写法(与上面的写法作用一致):

student: {id: 1,name: Java,age: 18} 

这个时候就不能用 @Value 来读取配置中的对象了,此时要使用另一个注解 @ConfigurationProperties 来读取,具体实现如下:

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; } 

调用类的实现如下:

@RestController public class StudentController { @Autowired private Student student; @RequestMapping("/readStudent") public String readStudent(){ return student.toString(); } } 

访问地址:http://127.0.0.1:8080/readStudent

5.2.3 配置集合

配置文件也可以配置 list 集合,如下所示:

dbtypes: name: - mysql - sqlserver - db2 

集合的读取和对象一样,也是使用 @ConfigurationProperties 来读取的,具体实现如下:

import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.List; @Component @ConfigurationProperties("dbtypes") @Data public class ListConfig { private List<String> name; } 

访问集合的实现如下:

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class ReadYml2 { @Autowired private ListConfig listConfig; @RequestMapping("/readList") public String readList() { return listConfig.toString(); } } 

5.2.4 配置 Map

配置文件也可以配置 map,如下所示:

maptypes: map: k1: kk1 k2: kk2 k3: kk3 

或者是使用行内写法(与上面的写法作用一致):

maptypes: {map: {k1: kk1,k2: kk2, k3: kk3}} 

Map 的读取和对象一样,也是使用 @ConfigurationProperties 来读取的,具体实现如下:

import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.HashMap; @Component @ConfigurationProperties("maptypes") @Data public class MapConfig { private HashMap<String,String> map; }

打印类的实现

java

运行

@RestController public class ReadYml2 { @Autowired private MapConfig mapConfig; @RequestMapping("/readMap") public String readStudent() { return mapConfig.toString(); } } 

5.3 yml 优缺点

优点
  1. 可读性高,写法简单,易于理解
  2. 支持更多的数据类型,可以简单表达对象、数组、List、Map 等数据形态
  3. 支持更多的编程语言,不止是 Java 中可以使用,在 Golang、Python、Ruby、JavaScript 中也可以使用
缺点
  1. 不适合写复杂的配置文件
    • 转换的过程也比较花费精力,如果配置更复杂一点,可读性会更差,代码也会更难写
  2. 对格式有较强的要求(一个空格可能会引起一场血案)

转换为 yml:

keycloak: realm: demo resource: fm-cache-cloud credentials: secret: d4589683-0ce7-4982-bcd3 security: - authRoles: - user collections: - name: ssologinurl patterns: - /login/* 

比如 properties 格式如下:

keycloak.realm = demo keycloak.resource = fm-cache-cloud keycloak.credentials.secret = d4589683-0ce7-4982-bcd3 keycloak.security[0].authRoles[0] = user keycloak.security[0].collections[0].name = ssologinurl keycloak.security[0].collections[0].patterns[0] = /login/* 

Read more

Java 大视界 -- Java 大数据在智慧文旅景区游客时空行为模式挖掘与服务优化中的应用(295)

Java 大视界 -- Java 大数据在智慧文旅景区游客时空行为模式挖掘与服务优化中的应用(295)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也期待你毫无保留地分享独特见解,愿我们于此携手成长,共赴新程!💖 本博客的精华专栏: 【大数据新视界】 【Java 大视界】 【智创 AI 新视界】 【Java+Python 双剑合璧:AI 大数据实战通关秘籍】 社区:【青云交技术变现副业福利商务圈】和【架构师社区】的精华频道: 【福利社群】 【今日看点】 【今日精品佳作】 【每日成长记录】 Java 大视界 -- Java 大数据在智慧文旅景区游客时空行为模式挖掘与服务优化中的应用(295) * 引言:文旅数字化浪潮中,Java 大数据点亮智慧服务新图景 * 正文:Java 大数据驱动智慧文旅服务升级的技术路径 * 一、智慧文旅数据体系与

By Ne0inhk
飞算JavaAI炫技赛:电商系统商品管理模块设计与实现

飞算JavaAI炫技赛:电商系统商品管理模块设计与实现

飞算JavaAI炫技赛:电商系统商品管理模块设计与实现 🌟 Hello,我是摘星! 🌈 在彩虹般绚烂的技术栈中,我是那个永不停歇的色彩收集者。 🦋 每一个优化都是我培育的花朵,每一个特性都是我放飞的蝴蝶。 🔬 每一次代码审查都是我的显微镜观察,每一次重构都是我的化学实验。 🎵 在编程的交响乐中,我既是指挥家也是演奏者。让我们一起,在技术的音乐厅里,奏响属于程序员的华美乐章。 目录 飞算JavaAI炫技赛:电商系统商品管理模块设计与实现 需求分析与规划 一、功能需求 二、核心模块 三、技术选型 飞算JavaAI开发实录 准备AI开发提示词 需求理解阶段 接口设计阶段 表结构设计阶段 逻辑处理阶段 源码生成阶段 优化与调试心得 pom依赖 Mysql配置 redis配置 Elasticsearch配置 YAML配置文件 成果展示与总结 API接口列表 核心代码 开发总结 引用箴言 参考链接 关键词标签 需求分析与规划 一、功能需求 功能需求总览流程图 商品基本信息管理:

By Ne0inhk
【JAVA探索之路】简单聊聊Kafka

【JAVA探索之路】简单聊聊Kafka

目录 一、Kafka核心概念与架构 核心概念解析 集群架构一览 二、Kafka核心特性与工作原理 顺序I/O与零拷贝 生产者可靠性保证 精确一次语义 三、Kafka关键API与生态系统 四、Kafka运维管理 五、Kafka典型应用场景 一、Kafka核心概念与架构 要掌握 Kafka,必须从理解其精心设计的基本模型开始。 核心概念解析 * 消息与批次:Kafka 的基本数据单元称为“记录”,包含键、值和时间戳。为提高效率,多条记录会组合成“批次”进行传输。 * 主题与分区:消息按“主题”进行分类,类似于数据库的表。每个主题可被分割为多个“分区”,这是 Kafka 实现并行处理和横向扩展的基石。消息在分区内按追加顺序存储,并分配一个单调递增的偏移量,从而保证了消息的顺序性。 * 生产与消费:生产者将消息发布到指定主题的特定分区;消费者则以“拉”

By Ne0inhk