一文帶你深入了解SpringBoot參數(shù)配置的詳細(xì)步驟
一、參數(shù)配置:程序員的“遙控器”
SpringBoot應(yīng)用就像一個(gè)超級(jí)智能的變形金剛,而參數(shù)配置就是你手里的萬(wàn)能遙控器!你想讓它變成溫柔的Hello Kitty模式?調(diào)參數(shù)!想讓它變成狂暴的哥斯拉模式?還是調(diào)參數(shù)!它就像你女朋友的脾氣——全看你如何“配置”!
參數(shù)配置的三大門(mén)派:
application.properties - 保守派,喜歡用點(diǎn)號(hào)分隔
server.port=8080 spring.datasource.url=jdbc:mysql://localhost:3306/my_db
application.yml - 文藝派,喜歡用縮進(jìn)寫(xiě)詩(shī)
server:
port: 9090
spring:
datasource:
url: jdbc:mysql://localhost:3306/my_db
@Value注解 - 直男派,直接注入不啰嗦
@Value("${my.secret.password}")
private String password; // 默認(rèn)值:123456(才怪?。?
二、詳細(xì)配置步驟:從“Hello World”到“Hello 宇宙”
第1步:基礎(chǔ)配置 - 給你的應(yīng)用穿條褲子
# application.yml - 基礎(chǔ)生存包
server:
port: 8080 # 端口號(hào),建議別用80,免得和隔壁老王沖突
servlet:
context-path: /api # 上下文路徑,相當(dāng)于給你的應(yīng)用加個(gè)姓
spring:
application:
name: my-awesome-app # 應(yīng)用名,起得霸氣點(diǎn)準(zhǔn)沒(méi)錯(cuò)
# 數(shù)據(jù)庫(kù)配置 - 應(yīng)用的“腸胃系統(tǒng)”
datasource:
url: jdbc:mysql://localhost:3306/my_db?useSSL=false&serverTimezone=UTC
username: root
password: IForgetItAgain # 建議別寫(xiě)這里,用環(huán)境變量!
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 20 # 連接池大小,人多好辦事
minimum-idle: 5 # 最少閑著的連接,不能太懶
connection-timeout: 30000 # 連接超時(shí),30秒還連不上就放棄吧
第2步:高級(jí)配置 - 給你的應(yīng)用裝上“渦輪增壓”
# 繼續(xù)在application.yml中添加
spring:
# JPA配置 - 對(duì)象和數(shù)據(jù)庫(kù)的“翻譯官”
jpa:
show-sql: true # 顯示SQL,方便偷看它在背后說(shuō)什么
hibernate:
ddl-auto: update # 自動(dòng)更新表結(jié)構(gòu),危險(xiǎn)但方便!
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL8Dialect
# Redis配置 - 應(yīng)用的“短期記憶”
redis:
host: localhost
port: 6379
timeout: 3000ms # 超時(shí)時(shí)間,3秒還想不明白就算了
lettuce:
pool:
max-active: 8 # 最大活躍連接,別太多會(huì)打架
# 文件上傳配置 - 胃口大小設(shè)置
servlet:
multipart:
max-file-size: 10MB # 單個(gè)文件最大,別上傳整個(gè)電影!
max-request-size: 100MB # 總請(qǐng)求大小
# 自定義配置 - 你的專(zhuān)屬“秘密武器”
myapp:
config:
max-retry-count: 3 # 重試次數(shù),事不過(guò)三!
enable-feature-x: true # 要不要開(kāi)啟某個(gè)神秘功能
api-key: ${API_KEY:default-key} # 優(yōu)先用環(huán)境變量,沒(méi)有就用默認(rèn)值
第3步:Profile配置 - 應(yīng)用的多重人格
創(chuàng)建不同環(huán)境的配置文件,讓你的應(yīng)用學(xué)會(huì)“變臉”:
application.yml # 公共配置,大家都得遵守 application-dev.yml # 開(kāi)發(fā)環(huán)境 - 隨便折騰版 application-test.yml # 測(cè)試環(huán)境 - 裝模作樣版 application-prod.yml # 生產(chǎn)環(huán)境 - 正經(jīng)上班版
application-dev.yml(開(kāi)發(fā)環(huán)境)
spring:
datasource:
url: jdbc:h2:mem:testdb # 內(nèi)存數(shù)據(jù)庫(kù),用完就扔
username: sa
password:
h2:
console:
enabled: true # 啟用H2控制臺(tái),可視化偷看數(shù)據(jù)
path: /h2-console
logging:
level:
com.myapp: DEBUG # 詳細(xì)日志,方便甩鍋時(shí)找證據(jù)
org.springframework.web: DEBUG
application-prod.yml(生產(chǎn)環(huán)境)
spring:
datasource:
url: jdbc:mysql://prod-db:3306/prod_db?useSSL=true
username: ${DB_USERNAME} # 從環(huán)境變量讀取,安全第一!
password: ${DB_PASSWORD}
logging:
level:
com.myapp: WARN # 生產(chǎn)環(huán)境日志別太多,磁盤(pán)會(huì)哭
org.springframework: ERROR
management:
endpoints:
web:
exposure:
include: health,info # 只暴露必要的監(jiān)控端點(diǎn)
第4步:配置類(lèi) - 程序員最后的倔強(qiáng)
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "myapp.config")
@Data // Lombok注解,自動(dòng)生成getter/setter
public class MyAppConfig {
/**
* 最大重試次數(shù)
* 默認(rèn)值:防止有人不配置時(shí)系統(tǒng)直接崩潰
*/
private int maxRetryCount = 3;
/**
* 是否開(kāi)啟神秘功能X
* 默認(rèn)值:false(安全第一)
*/
private boolean enableFeatureX = false;
/**
* API密鑰
* 建議:寫(xiě)在配置文件里不如寫(xiě)在環(huán)境變量里
* 寫(xiě)在環(huán)境變量里不如寫(xiě)在腦子里(但容易忘)
*/
private String apiKey = "change-me";
/**
* 服務(wù)器列表
* 示例配置:myapp.config.servers[0]=http://server1
* myapp.config.servers[1]=http://server2
*/
private List<String> servers = new ArrayList<>();
/**
* 連接超時(shí)時(shí)間
* 單位:毫秒
* 哲學(xué)問(wèn)題:等待多久才算真愛(ài)?
*/
private Duration connectionTimeout = Duration.ofSeconds(30);
}
// 使用配置類(lèi)
@Service
public class MyService {
@Autowired
private MyAppConfig config;
public void doSomething() {
if (config.isEnableFeatureX()) {
System.out.println("神秘功能已開(kāi)啟,但沒(méi)人知道是啥功能");
}
for (int i = 0; i < config.getMaxRetryCount(); i++) {
try {
// 嘗試做事
break;
} catch (Exception e) {
System.out.println("第" + (i+1) + "次失敗,還剩" +
(config.getMaxRetryCount() - i - 1) + "次機(jī)會(huì)");
}
}
}
}
第5步:環(huán)境變量和命令行參數(shù) - 終極武器
# 運(yùn)行時(shí)指定配置 java -jar myapp.jar --server.port=9090 --spring.profiles.active=prod # 使用環(huán)境變量(Linux/Mac) export SPRING_DATASOURCE_PASSWORD=SuperSecret123 export MYAPP_CONFIG_APIKEY=MyAwesomeKey java -jar myapp.jar # 使用環(huán)境變量(Windows PowerShell) $env:SPRING_DATASOURCE_PASSWORD="SuperSecret123" java -jar myapp.jar
優(yōu)先級(jí)總結(jié)(從高到低):
- 命令行參數(shù)(--開(kāi)頭)
- 環(huán)境變量(SPRING_APPLICATION_JSON)
- Profile特定配置文件(application-{profile}.yml)
- 默認(rèn)配置文件(application.yml)
- @ConfigurationProperties默認(rèn)值
三、配置驗(yàn)證 - 給你的配置上個(gè)保險(xiǎn)
import javax.validation.constraints.*;
@Component
@ConfigurationProperties(prefix = "myapp.config")
@Validated // 開(kāi)啟驗(yàn)證
@Data
public class ValidatedConfig {
@NotNull(message = "API密鑰不能為空,除非你想裸奔")
@Size(min = 10, max = 100, message = "API密鑰長(zhǎng)度要在10-100之間")
private String apiKey;
@Min(value = 1, message = "重試次數(shù)至少1次,放棄治療不可取")
@Max(value = 10, message = "重試次數(shù)最多10次,要學(xué)會(huì)放棄")
private int maxRetryCount = 3;
@Pattern(regexp = "^(http|https)://.*", message = "URL必須以http或https開(kāi)頭")
private String baseUrl;
@AssertTrue(message = "如果開(kāi)啟功能X,必須提供密鑰")
public boolean isFeatureXValid() {
return !enableFeatureX || (apiKey != null && !apiKey.isEmpty());
}
}
四、動(dòng)態(tài)刷新配置 - 不用重啟的魔法
# 添加Spring Cloud Config依賴(lài)后
spring:
cloud:
config:
enabled: true
config:
import: optional:configserver:http://localhost:8888 # 配置中心地址
# 在需要刷新的類(lèi)上添加
@RefreshScope
@Component
public class ConfigRefreshService {
@Value("${myapp.config.feature-toggle}")
private String featureToggle;
// 配置更新后,這個(gè)值會(huì)自動(dòng)刷新!
}
五、配置加密 - 讓密碼不再裸奔
# 使用jasypt加密敏感信息
spring:
datasource:
password: ENC(加密后的字符串) # 看起來(lái)像亂碼就對(duì)了
# 啟動(dòng)時(shí)提供加密密鑰
java -jar myapp.jar --jasypt.encryptor.password=my-secret-key
總結(jié):配置之道,存乎一心
SpringBoot的配置系統(tǒng)就像是一套精密的樂(lè)高積木,既有現(xiàn)成的標(biāo)準(zhǔn)件(自動(dòng)配置),也允許你自由發(fā)揮(自定義配置)。掌握配置的藝術(shù),需要記住幾個(gè)核心原則:
配置的“三大紀(jì)律八項(xiàng)注意”
- 安全第一:密碼、密鑰永遠(yuǎn)不要硬編碼,用環(huán)境變量或配置中心
- 環(huán)境隔離:開(kāi)發(fā)、測(cè)試、生產(chǎn)配置嚴(yán)格分開(kāi),別在開(kāi)發(fā)環(huán)境玩生產(chǎn)數(shù)據(jù)
- 適度原則:不要過(guò)度配置,SpringBoot的自動(dòng)配置已經(jīng)幫你做了80%的工作
配置的“哲學(xué)思考”
- YAML vs Properties:YAML就像寫(xiě)詩(shī),Properties就像寫(xiě)清單,看你喜歡文藝還是務(wù)實(shí)
- 配置優(yōu)先級(jí):記住命令行參數(shù) > 環(huán)境變量 > 配置文件,這是權(quán)力的游戲!
- 默認(rèn)值的重要性:給配置項(xiàng)設(shè)置合理的默認(rèn)值,就像給程序買(mǎi)保險(xiǎn)
最后
記住,最好的配置是不需要配置(但這是理想狀態(tài))。SpringBoot的“約定優(yōu)于配置”理念,意味著只要你遵守約定,它就會(huì)默默為你做好一切。但當(dāng)你有特殊需求時(shí),這套強(qiáng)大的配置系統(tǒng)又能給你充分的自由。
現(xiàn)在,拿起你的配置“遙控器”,去打造一個(gè)既聽(tīng)話又能干的SpringBoot應(yīng)用吧!記?。号渲貌皇悄康?,讓?xiě)?yīng)用更好地服務(wù)業(yè)務(wù)才是終極目標(biāo)。祝你在配置的海洋里乘風(fēng)破浪,但別淹死在配置文件中!
到此這篇關(guān)于一文帶你深入了解SpringBoot參數(shù)配置的詳細(xì)步驟的文章就介紹到這了,更多相關(guān)SpringBoot參數(shù)配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring AOP與代理類(lèi)的執(zhí)行順序級(jí)別淺析
這篇文章主要介紹了Spring AOP與代理類(lèi)的執(zhí)行順序級(jí)別,關(guān)于 Spring AOP和Aspectj的關(guān)系,兩個(gè)都實(shí)現(xiàn)了切面編程,Spring AOP更多地是為了Spring框架本身服務(wù)的,而Aspectj具有更強(qiáng)大、更完善的切面功能2023-03-03
Java校驗(yàn)validate介紹和使用實(shí)例
這篇文章主要介紹了Java校驗(yàn)validate介紹和使用的相關(guān)資料,還介紹了如何使用@Valid和@Validated注解進(jìn)行聲明式校驗(yàn),以及如何處理復(fù)雜校驗(yàn)需求,通過(guò)自定義校驗(yàn)注解來(lái)實(shí)現(xiàn),需要的朋友可以參考下2025-01-01
Java GZip 基于磁盤(pán)實(shí)現(xiàn)壓縮和解壓的方法
這篇文章主要介紹了Java GZip 基于磁盤(pán)實(shí)現(xiàn)壓縮和解壓,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考需要的朋友可以參考下2020-08-08
Spring中的事務(wù)管理及實(shí)現(xiàn)方式解析
這篇文章主要介紹了Spring中的事務(wù)管理及實(shí)現(xiàn)方式解析,Spring事務(wù)管理基于底層數(shù)據(jù)庫(kù)本身的事務(wù)處理機(jī)制,數(shù)據(jù)庫(kù)事務(wù)的基礎(chǔ),是掌握Spring事務(wù)管理的基礎(chǔ),這篇總結(jié)下Spring事務(wù),需要的朋友可以參考下2024-01-01
MyBatis-Plus集成Druid環(huán)境搭建的詳細(xì)教程
這篇文章主要介紹了MyBatis-Plus集成Druid環(huán)境搭建的詳細(xì)教程,需要的朋友可以參考下2020-08-08
Maven分模塊開(kāi)發(fā)與依賴(lài)管理和聚合和繼承及屬性深入詳細(xì)介紹
依賴(lài)管理是項(xiàng)目管理中非常重要的一環(huán)。幾乎任何項(xiàng)目開(kāi)發(fā)的時(shí)候需要都需要使用到庫(kù)。而這些庫(kù)很可能又依賴(lài)別的庫(kù),這樣整個(gè)項(xiàng)目的依賴(lài)形成了一個(gè)樹(shù)狀結(jié)構(gòu),而隨著這個(gè)依賴(lài)的樹(shù)的延伸和擴(kuò)大,一系列問(wèn)題就會(huì)隨之產(chǎn)生2022-10-10
Java 中的進(jìn)制轉(zhuǎn)換與編碼機(jī)制詳解
在 Java 編程領(lǐng)域,進(jìn)制轉(zhuǎn)換是一項(xiàng)極為基礎(chǔ)且重要的技能,下面給大家介紹Java 中的進(jìn)制轉(zhuǎn)換與編碼機(jī)制,感興趣的朋友一起看看吧2025-04-04
Springboot啟用多個(gè)監(jiān)聽(tīng)端口代碼實(shí)例
這篇文章主要介紹了Springboot啟用多個(gè)監(jiān)聽(tīng)端口代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06

