SpringBoot 配置文件作用
SpringBoot 定义了规范的配置文件格式,用于集成其他框架,并集中管理项目各类配置信息,典型场景包括:
- 项目启动端口:自定义服务监听端口
- 数据库连接信息:包含用户名、密码等
- 第三方系统调用密钥
- 日志配置:普通日志、异常日志,用于问题定位与排查
1. 关键配置场景说明
1.1 项目启动端口
- SpringBoot 内置 Tomcat 服务器,默认端口号为 8080。
- 若 8080 端口被其他程序占用,需通过配置文件自定义端口号。
1.2 数据库连接信息
- 持久层框架(如 MyBatis、JPA 等)是对 JDBC 的深层封装。
- 不同应用访问的数据库不同,需通过配置文件自定义数据库连接参数。
2. 配置文件快速入门
SpringBoot 项目创建时,会自动生成配置文件。可通过修改配置文件更改服务端口号(解决 8080 端口被占用问题)。
2.1 修改 application.properties 文件
server.port=9090
重启后显示 Tomcat 启动端口号为 9090。
访问程序:http://127.0.0.1:9090/login.html
此时 http://127.0.0.1:8080/login.html 将无法访问。
3. 配置文件的格式
Spring Boot 配置文件主要有以下三种:
application.properties
application.yml
application.yaml
注意:properties 优先级比 yml/yaml 高。yml 为 yaml 的简写,实际开发中出现频率最高。
当应用程序启动时,Spring Boot 会自动从 classpath 路径找到并加载上述文件。也可以通过 spring.config.name 指定文件路径和名称。
3.1 配置文件包装类比
类似商品包装,.properties 是传统格式(Spring Boot 项目默认),.yml 是新版格式,实际开发中更推荐使用。
3.2 特殊说明
- 共存与优先级:理论上
.properties 和 .yml 可共存,启动时都会加载;若配置冲突,.properties 优先级更高。
- 实践建议:实际业务中建议统一使用一种格式,便于维护、降低故障概率。
注意事项:
IDEA 重启后可能出现乱码情况,通常需检查本地配置文件编码设置或 IDE 编码配置。
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
访问 /key 接口时,会返回配置文件中 mykey.key1 对应的值。
@PostConstruct 核心说明
@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;
@Component
public class UserService {
@Autowired
private ConfigService configService;
@PostConstruct
public void init() {
String config = configService.getConfig();
System.out.println("Bean 初始化完成,加载配置:" + config);
}
}
@Component
class ConfigService {
public String getConfig() {
return "数据库连接配置:jdbc:mysql://localhost:3306/test";
}
}
关键注意点:
- 标注的方法必须是:无参数、无返回值(void)、非静态。
- 执行时机:晚于
@Autowired 依赖注入,早于 Bean 被业务代码使用。
- 替代方案:Spring 的
InitializingBean 接口(但 @PostConstruct 更简洁)。
4.3 properties 缺点分析
properties 配置是以 key-value 的形式配置的,配置文件中会有很多的冗余信息,例如层级关系不直观。
想要解决这个问题,就可以使用 yml 配置文件的格式化优势。
5. yml 配置文件说明
yml 是 YAML 的缩写,全称是 Yet Another Markup Language,即'另一种标记语言'。
5.1 yml 基本语法
yml 是树形结构的配置文件,它的基础语法是 key: value。
- key 和 value 之间使用英文冒号加空格的方式组成,空格不可省略。
基础语法如下:
server:
port: 8080
host: localhost
5.1.1 数据类型
name: 张三
nickname: "zhangsan:001"
remark: 'hello\nworld'
age: 20
score: 98.5
enabled: true
disabled: false
empty: null
birthday: 2024-03-18
5.1.2 集合 / 数组(两种写法)
user:
hobbies:
- 篮球
- 游泳
- 编程
user:
tags: [Java, SpringBoot, MySQL]
5.1.3 对象 / 嵌套配置
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.1.4 注释规则
server:
port: 8080
5.1.5 使用 yml 连接数据库
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/dbname?characterEncoding=utf8&useSSL=false
username: root
password: root
5.2 yml 使用进阶
5.2.1 配置不同数据类型及 null
string:
hello: bite
5.2.1.1 yml 配置读取
yml 读取配置的方式和 properties 相同,使用 @Value 注解即可。
Java 代码:
@RestController
public class ReadYml {
@Value("${string.hello}")
private String hello;
@RequestMapping("/ymlKey")
public String key() {
return "读取到值:" + hello;
}
}
运行结果: 页面显示:读取到值: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.
从上述结果可以看出:
- 字符串默认不用加上单引号或者双引号。
- 单引号会转义特殊字符,使其失去特殊功能,始终是一个普通的字符串。
- 双引号不会转义字符串里面的特殊字符,特殊字符会表示本身的含义。
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();
}
}
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;
}
5.2.4 配置 Map
配置文件也可以配置 map:
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;
}
打印类的实现:
@RestController
public class ReadYml2 {
@Autowired
private MapConfig mapConfig;
@RequestMapping("/readMap")
public String readStudent() {
return mapConfig.toString();
}
}
5.3 yml 优缺点
优点
- 可读性高,写法简单,易于理解。
- 支持更多的数据类型,可以简单表达对象、数组、List、Map 等数据形态。
- 支持更多的编程语言,不止是 Java 中可以使用,在 Golang、Python、Ruby、JavaScript 中也可以使用。
缺点
- 不适合写复杂的配置文件。转换的过程也比较花费精力,如果配置更复杂一点,可读性会更差,代码也会更难写。
- 对格式有较强的要求(一个空格可能会引起错误)。
转换为 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/*