一、關于bosststrap.yml
?
bootstrap.yml
和application.yml
的區別
對比項 bootstrap.yml
application.yml
加載時機 優先于 application.yml
加載(啟動早期)程序初始化完成后加載 主要用途 設置應用的外部配置源、注冊中心信息等 設置應用內部配置,如端口、日志級別、bean 配置等 使用場景 需要在程序啟動早期就完成配置加載的情況 常規配置
? Nacos 配置中心為什么推薦用
bootstrap.yml
?Spring Cloud Alibaba 的配置加載機制,是基于 Spring Cloud Config 客戶端架構實現的,讀取遠程配置的行為是發生在應用上下文啟動之前。
🚨 也就是說:如果你把 Nacos 的配置寫到
application.yml
,此時還沒加載配置中心,自然就讀取不到遠程配置。所以要寫到
bootstrap.yml
。
? 實際建議(記住這個就行):
凡是涉及到外部配置源(如 Nacos 配置中心、Spring Cloud Config Server、Apollo 等)的信息,必須寫在
bootstrap.yml
中。比如這些字段:
spring:application:name: nacos-config-democloud:nacos:config:server-addr: 127.0.0.1:8848file-extension: yaml
? Spring Boot 3.x 的變化(附加知識)
從 Spring Boot 2.4 開始,引入了一個新的配置機制叫做
config
子系統,官方推薦使用application.yml
+configimport
替代bootstrap.yml
。比如你可以寫成:
spring:config:import: nacos:nacos-config-demo.yaml
但目前大多數 Spring Cloud Alibaba 項目依舊推薦
bootstrap.yml
,特別是 Spring Boot 2.x 的項目。一、@RefreshScope注解
?為什么需要
@RefreshScope
?在使用 Nacos 作為配置中心時,我們常常希望在不重啟服務的情況下,動態刷新配置項的值。Spring Cloud 提供了
@RefreshScope
注解來實現這個需求。默認情況下,Spring 容器中注入的配置值(如通過
@Value
或@ConfigurationProperties
)在應用啟動后就被固定了,即使 Nacos 中的配置發生了變更,也不會自動刷新,除非重啟服務。因此:
?
@RefreshScope
的作用就是:
讓被注解的類或 Bean 在配置變更時,能夠自動重新加載最新的配置,實現配置的熱更新。
?加在哪里?
1. 用在配置類上(推薦)
@RefreshScope @Configuration @ConfigurationProperties(prefix = "user") public class UserConfig {private String name;private Integer age;// 省略 getter/setter }
此時,如果 Nacos 中
user.name
或user.age
的配置發生變更,該類會自動重新加載配置。2. 用在使用
@Value
的類上@RestController @RefreshScope // 必須加在類上 public class UserController {@Value("${user.name}")private String name;@GetMapping("/user/name")public String getName() {return name;} }
注意:如果你用的是
@Value
,必須加在類上才會生效。加在字段上無效!
? 配合使用的前提
要使
@RefreshScope
生效,還需確保:
Nacos 配置變更時已開啟 自動刷新(
refresh: true
)。引入了必要依賴(Spring Cloud Alibaba Nacos Config)。
項目中引入了 Spring Boot Actuator,并暴露了
/actuator/refresh
接口(對于手動刷新場景)。