大家好,我是小悟。
一、参数配置:程序员的"遥控器"
SpringBoot应用就像一个超级智能的变形金刚,而参数配置就是你手里的万能遥控器!你想让它变成温柔的Hello Kitty模式?调参数!想让它变成狂暴的哥斯拉模式?还是调参数!它就像你女朋友的脾气------全看你如何"配置"!
参数配置的三大门派:
-
application.properties - 保守派,喜欢用点号分隔
iniserver.port=8080 spring.datasource.url=jdbc:mysql://localhost:3306/my_db -
application.yml - 文艺派,喜欢用缩进写诗
yamlserver: port: 9090 spring: datasource: url: jdbc:mysql://localhost:3306/my_db -
@Value注解 - 直男派,直接注入不啰嗦
kotlin@Value("${my.secret.password}") private String password; // 默认值:123456(才怪!)
二、详细配置步骤:从"Hello World"到"Hello 宇宙"
第1步:基础配置 - 给你的应用穿条裤子
yaml
# application.yml - 基础生存包
server:
port: 8080 # 端口号,建议别用80,免得和隔壁老王冲突
servlet:
context-path: /api # 上下文路径,相当于给你的应用加个姓
spring:
application:
name: my-awesome-app # 应用名,起得霸气点准没错
# 数据库配置 - 应用的"肠胃系统"
datasource:
url: jdbc:mysql://localhost:3306/my_db?useSSL=false&serverTimezone=UTC
username: root
password: IForgetItAgain # 建议别写这里,用环境变量!
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 20 # 连接池大小,人多好办事
minimum-idle: 5 # 最少闲着的连接,不能太懒
connection-timeout: 30000 # 连接超时,30秒还连不上就放弃吧
第2步:高级配置 - 给你的应用装上"涡轮增压"
yaml
# 继续在application.yml中添加
spring:
# JPA配置 - 对象和数据库的"翻译官"
jpa:
show-sql: true # 显示SQL,方便偷看它在背后说什么
hibernate:
ddl-auto: update # 自动更新表结构,危险但方便!
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL8Dialect
# Redis配置 - 应用的"短期记忆"
redis:
host: localhost
port: 6379
timeout: 3000ms # 超时时间,3秒还想不明白就算了
lettuce:
pool:
max-active: 8 # 最大活跃连接,别太多会打架
# 文件上传配置 - 胃口大小设置
servlet:
multipart:
max-file-size: 10MB # 单个文件最大,别上传整个电影!
max-request-size: 100MB # 总请求大小
# 自定义配置 - 你的专属"秘密武器"
myapp:
config:
max-retry-count: 3 # 重试次数,事不过三!
enable-feature-x: true # 要不要开启某个神秘功能
api-key: ${API_KEY:default-key} # 优先用环境变量,没有就用默认值
第3步:Profile配置 - 应用的多重人格
创建不同环境的配置文件,让你的应用学会"变脸":
bash
application.yml # 公共配置,大家都得遵守
application-dev.yml # 开发环境 - 随便折腾版
application-test.yml # 测试环境 - 装模作样版
application-prod.yml # 生产环境 - 正经上班版
application-dev.yml(开发环境)
yaml
spring:
datasource:
url: jdbc:h2:mem:testdb # 内存数据库,用完就扔
username: sa
password:
h2:
console:
enabled: true # 启用H2控制台,可视化偷看数据
path: /h2-console
logging:
level:
com.myapp: DEBUG # 详细日志,方便甩锅时找证据
org.springframework.web: DEBUG
application-prod.yml(生产环境)
yaml
spring:
datasource:
url: jdbc:mysql://prod-db:3306/prod_db?useSSL=true
username: ${DB_USERNAME} # 从环境变量读取,安全第一!
password: ${DB_PASSWORD}
logging:
level:
com.myapp: WARN # 生产环境日志别太多,磁盘会哭
org.springframework: ERROR
management:
endpoints:
web:
exposure:
include: health,info # 只暴露必要的监控端点
第4步:配置类 - 程序员最后的倔强
arduino
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "myapp.config")
@Data // Lombok注解,自动生成getter/setter
public class MyAppConfig {
/**
* 最大重试次数
* 默认值:防止有人不配置时系统直接崩溃
*/
private int maxRetryCount = 3;
/**
* 是否开启神秘功能X
* 默认值:false(安全第一)
*/
private boolean enableFeatureX = false;
/**
* API密钥
* 建议:写在配置文件里不如写在环境变量里
* 写在环境变量里不如写在脑子里(但容易忘)
*/
private String apiKey = "change-me";
/**
* 服务器列表
* 示例配置:myapp.config.servers[0]=http://server1
* myapp.config.servers[1]=http://server2
*/
private List<String> servers = new ArrayList<>();
/**
* 连接超时时间
* 单位:毫秒
* 哲学问题:等待多久才算真爱?
*/
private Duration connectionTimeout = Duration.ofSeconds(30);
}
// 使用配置类
@Service
public class MyService {
@Autowired
private MyAppConfig config;
public void doSomething() {
if (config.isEnableFeatureX()) {
System.out.println("神秘功能已开启,但没人知道是啥功能");
}
for (int i = 0; i < config.getMaxRetryCount(); i++) {
try {
// 尝试做事
break;
} catch (Exception e) {
System.out.println("第" + (i+1) + "次失败,还剩" +
(config.getMaxRetryCount() - i - 1) + "次机会");
}
}
}
}
第5步:环境变量和命令行参数 - 终极武器
ini
# 运行时指定配置
java -jar myapp.jar --server.port=9090 --spring.profiles.active=prod
# 使用环境变量(Linux/Mac)
export SPRING_DATASOURCE_PASSWORD=SuperSecret123
export MYAPP_CONFIG_APIKEY=MyAwesomeKey
java -jar myapp.jar
# 使用环境变量(Windows PowerShell)
$env:SPRING_DATASOURCE_PASSWORD="SuperSecret123"
java -jar myapp.jar
优先级总结(从高到低):
- 命令行参数(--开头)
- 环境变量(SPRING_APPLICATION_JSON)
- Profile特定配置文件(application-{profile}.yml)
- 默认配置文件(application.yml)
- @ConfigurationProperties默认值
三、配置验证 - 给你的配置上个保险
less
import javax.validation.constraints.*;
@Component
@ConfigurationProperties(prefix = "myapp.config")
@Validated // 开启验证
@Data
public class ValidatedConfig {
@NotNull(message = "API密钥不能为空,除非你想裸奔")
@Size(min = 10, max = 100, message = "API密钥长度要在10-100之间")
private String apiKey;
@Min(value = 1, message = "重试次数至少1次,放弃治疗不可取")
@Max(value = 10, message = "重试次数最多10次,要学会放弃")
private int maxRetryCount = 3;
@Pattern(regexp = "^(http|https)://.*", message = "URL必须以http或https开头")
private String baseUrl;
@AssertTrue(message = "如果开启功能X,必须提供密钥")
public boolean isFeatureXValid() {
return !enableFeatureX || (apiKey != null && !apiKey.isEmpty());
}
}
四、动态刷新配置 - 不用重启的魔法
kotlin
# 添加Spring Cloud Config依赖后
spring:
cloud:
config:
enabled: true
config:
import: optional:configserver:http://localhost:8888 # 配置中心地址
# 在需要刷新的类上添加
@RefreshScope
@Component
public class ConfigRefreshService {
@Value("${myapp.config.feature-toggle}")
private String featureToggle;
// 配置更新后,这个值会自动刷新!
}
五、配置加密 - 让密码不再裸奔
yaml
# 使用jasypt加密敏感信息
spring:
datasource:
password: ENC(加密后的字符串) # 看起来像乱码就对了
# 启动时提供加密密钥
java -jar myapp.jar --jasypt.encryptor.password=my-secret-key
总结:配置之道,存乎一心
SpringBoot的配置系统就像是一套精密的乐高积木,既有现成的标准件(自动配置),也允许你自由发挥(自定义配置)。掌握配置的艺术,需要记住几个核心原则:
配置的"三大纪律八项注意":
- 安全第一:密码、密钥永远不要硬编码,用环境变量或配置中心
- 环境隔离:开发、测试、生产配置严格分开,别在开发环境玩生产数据
- 适度原则:不要过度配置,SpringBoot的自动配置已经帮你做了80%的工作
配置的"哲学思考":
- YAML vs Properties:YAML就像写诗,Properties就像写清单,看你喜欢文艺还是务实
- 配置优先级:记住命令行参数 > 环境变量 > 配置文件,这是权力的游戏!
- 默认值的重要性:给配置项设置合理的默认值,就像给程序买保险
最后:
记住,最好的配置是不需要配置(但这是理想状态)。SpringBoot的"约定优于配置"理念,意味着只要你遵守约定,它就会默默为你做好一切。但当你有特殊需求时,这套强大的配置系统又能给你充分的自由。
现在,拿起你的配置"遥控器",去打造一个既听话又能干的SpringBoot应用吧!记住:配置不是目的,让应用更好地服务业务才是终极目标。祝你在配置的海洋里乘风破浪,但别淹死在配置文件中!
如果你发现自己在配置文件中写了一篇小说,可能该考虑用配置中心了。

谢谢你看我的文章,既然看到这里了,如果觉得不错,随手点个赞、转发、在看三连吧,感谢感谢。那我们,下次再见。
您的一键三连,是我更新的最大动力,谢谢
山水有相逢,来日皆可期,谢谢阅读,我们再会
我手中的金箍棒,上能通天,下能探海