application.yaml與bootstrap.yaml的使用
application.yaml與bootstrap.yaml
你對(duì)這兩個(gè)文件有沒(méi)有清晰認(rèn)識(shí)?
application.yaml
- 用途:主要用于應(yīng)用程序的主要配置,包括數(shù)據(jù)庫(kù)連接信息、端口號(hào)、日志級(jí)別、自定義屬性等應(yīng)用級(jí)別的設(shè)置。這是Spring Boot應(yīng)用中最常見(jiàn)的配置文件,幾乎所有自定義配置都會(huì)放在這里。
- 加載時(shí)機(jī):
application.yaml
在Spring應(yīng)用上下文初始化之后被加載,這意味著大部分Bean的創(chuàng)建和自動(dòng)配置都會(huì)考慮到這里的配置信息。 - 覆蓋:可以通過(guò)命令行參數(shù)、環(huán)境變量、Java系統(tǒng)屬性等方式覆蓋
application.yaml
中的配置。
bootstrap.yaml
- 用途:主要用于應(yīng)用程序的引導(dǎo)階段配置,特別是與Spring Cloud相關(guān)的配置,如配置中心(Config Server)的地址。它的內(nèi)容在應(yīng)用程序的上下文初始化之前被加載,適合配置那些需要在Spring應(yīng)用上下文啟動(dòng)之前就需要讀取的屬性,比如用來(lái)配置從何處加載主配置文件的地址。
- 加載時(shí)機(jī):
bootstrap.yaml
文件比application.yaml
更早加載,它在應(yīng)用程序的引導(dǎo)階段就被處理,用于應(yīng)用程序上下文初始化之前的配置,比如配置中心的配置。 - 用途示例:當(dāng)使用Spring Cloud Config Server來(lái)集中管理配置時(shí),你需要在
bootstrap.yaml
中配置Config Server的地址,這樣Spring Cloud會(huì)先從Config Server獲取配置信息,再初始化Spring Boot應(yīng)用。
這兩大段在講什么 不能簡(jiǎn)單講一下嗎?
知識(shí)儲(chǔ)備
- Bean:實(shí)現(xiàn)控制反轉(zhuǎn)的一個(gè)java對(duì)象 加入到ioc容器當(dāng)中
- Spring上下文:Bean管理 資源訪問(wèn) 消息傳遞 生命周期管理 我就簡(jiǎn)單講一下第一個(gè)【第一個(gè)最好講】 Bean管理 : ApplicationContext 讀取配置元數(shù)據(jù)(xml文件 java配置 注解 )根據(jù)這些數(shù)據(jù)創(chuàng)建Bean 實(shí)現(xiàn)控制反轉(zhuǎn)
Spring上下文啟動(dòng):加載配置 -》 bean讀取 -》 bean的實(shí)例化 -》 bean的初始化 -》 啟動(dòng)后監(jiān)聽(tīng)
容器初始化階段(加載配置階段) springboot 會(huì)讀取 application.yaml 文件
bootstrap.yaml 文件在加載配置階段前 就已經(jīng)讀取了
bootstrap.yaml
更早加載,主要用于引導(dǎo)配置,影響整個(gè)應(yīng)用的初始化;而 application.yaml
加載較晚,負(fù)責(zé)應(yīng)用的主體配置,靈活性和可覆蓋性更高。
我們來(lái)舉例
bootstrap
配置文件在Spring Boot應(yīng)用的啟動(dòng)過(guò)程中比application
配置文件具有更高的優(yōu)先級(jí)。
這意味著在應(yīng)用初始化的最早階段,Spring會(huì)先讀取bootstrap
文件中的配置。
由于Nacos作為配置中心,負(fù)責(zé)提供應(yīng)用運(yùn)行時(shí)所需的配置信息,將其地址放在bootstrap
中可以確保應(yīng)用在加載其他任何配置或初始化Bean之前就能建立起與Nacos的連接,從而能夠及時(shí)獲取到所有必需的配置。
server: port: 3000 # 前端默認(rèn)訪問(wèn)端口號(hào)為3000 servlet: context-path: / # 前端默認(rèn)訪問(wèn)的根路徑 spring: application: name: gateway-service # 程序名就是服務(wù)名 cloud: nacos: server-addr: 174.148.4.170:8848 #注冊(cè)中心
當(dāng)然還有其他原因:
- 功能隔離:
bootstrap
配置主要用于應(yīng)用程序的引導(dǎo)階段,它配置的內(nèi)容是用來(lái)引導(dǎo)Spring Boot應(yīng)用上下文的創(chuàng)建,比如配置中心的地址、安全證書、加密解密的密鑰等基礎(chǔ)設(shè)施級(jí)別的設(shè)置。而application
配置則是關(guān)于應(yīng)用本身的業(yè)務(wù)邏輯和特性配置。將Nacos地址這樣的基礎(chǔ)設(shè)施配置與業(yè)務(wù)邏輯配置分離開(kāi)來(lái),有助于清晰地組織配置,同時(shí)也便于管理和維護(hù)。 - 安全性與穩(wěn)定性:將與配置中心通信的敏感信息和基礎(chǔ)配置放在
bootstrap
中,可以減少這些關(guān)鍵信息被不當(dāng)覆蓋的風(fēng)險(xiǎn),因?yàn)?code>bootstrap的配置不容易被外部環(huán)境變量或其他配置源所覆蓋。這對(duì)于生產(chǎn)環(huán)境尤其重要,保證了系統(tǒng)的穩(wěn)定性和安全性。 - 避免循環(huán)依賴:如果Nacos配置包含了應(yīng)用運(yùn)行所必需的參數(shù)(比如數(shù)據(jù)庫(kù)連接字符串),而這些參數(shù)又存儲(chǔ)在Nacos中,那么必須在應(yīng)用啟動(dòng)時(shí)就正確設(shè)置Nacos的地址以獲取這些參數(shù),避免因配置加載順序?qū)е碌臐撛谘h(huán)依賴問(wèn)題
在來(lái)看一下3: 想象一下,你的Spring Boot應(yīng)用需要從Nacos獲取數(shù)據(jù)庫(kù)連接字符串等關(guān)鍵配置來(lái)初始化數(shù)據(jù)庫(kù)訪問(wèn)組件(如DataSource)。然而,這些數(shù)據(jù)庫(kù)連接信息實(shí)際上是存儲(chǔ)在Nacos中的。
這就形成了一個(gè)邏輯上的依賴鏈:應(yīng)用啟動(dòng) -> 連接Nacos -> 獲取數(shù)據(jù)庫(kù)配置 -> 初始化數(shù)據(jù)庫(kù)連接。如果Nacos的地址或者連接Nacos所需的其他關(guān)鍵參數(shù)(如認(rèn)證信息)也打算通過(guò)Nacos來(lái)管理,那么就會(huì)出現(xiàn)問(wèn)題,因?yàn)檫@時(shí)應(yīng)用在沒(méi)有Nacos配置的情況下無(wú)法知道如何連接到Nacos以獲取這些配置信息,形成了一種“雞生蛋,蛋生雞”的困境,即循環(huán)依賴。
總結(jié)
看到這你應(yīng)該清楚了 哪些應(yīng)該寫在bootstrap.yaml 哪些應(yīng)該寫在application.yaml 里面
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
IntelliJ IDEA cmd和idea Terminal查看java版本不一致的解決
原來(lái)win10電腦上安裝的是jdk8的版本,因某些原因,現(xiàn)在想換成jdk7的版本,修改環(huán)境變量后,在cmd中執(zhí)行 [java -version]命令,顯示的是7的版本,遇到這樣的問(wèn)題如何解決呢?下面小編給大家分享IntelliJ IDEA cmd和idea Terminal查看java版本不一致的解決方案,一起看看吧2023-09-09Java數(shù)組的定義、初始化、及二維數(shù)組用法分析
這篇文章主要介紹了Java數(shù)組的定義、初始化、及二維數(shù)組用法,結(jié)合具體實(shí)例形式分析了java數(shù)組概念、功能、數(shù)組定義、靜態(tài)數(shù)組、動(dòng)態(tài)數(shù)組、二維數(shù)組等相關(guān)使用技巧,需要的朋友可以參考下2019-01-01SpringBoot結(jié)合ProGuard實(shí)現(xiàn)代碼混淆(最新版)
這篇文章主要介紹了SpringBoot結(jié)合ProGuard實(shí)現(xiàn)代碼混淆(最新版),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10教你創(chuàng)建springcloud微服務(wù)的基礎(chǔ)子服務(wù)的超詳細(xì)過(guò)程
這篇文章主要介紹了創(chuàng)建springcloud微服務(wù)的基礎(chǔ)子服務(wù),主要是創(chuàng)建兩個(gè)springboot服務(wù),在教程中增加springcloud相關(guān)組件,本文分步驟給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04深入解析JVM之內(nèi)存結(jié)構(gòu)及字符串常量池(推薦)
Java作為一種平臺(tái)無(wú)關(guān)性的語(yǔ)言,其主要依靠于Java虛擬機(jī)——JVM,接下來(lái)通過(guò)本文給大家介紹JVM之內(nèi)存結(jié)構(gòu)及字符串常量池的相關(guān)知識(shí),需要的朋友可以參考下2020-07-07SpringBoot訪問(wèn)windows共享文件的方法
這篇文章主要介紹了SpringBoot訪問(wèn)windows共享文件,項(xiàng)目使用minio存儲(chǔ)且不在同一臺(tái)服務(wù)器上,為了優(yōu)化速度決定使用windows共享功能進(jìn)行文件傳輸,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02Java線程實(shí)現(xiàn)的三種方式詳細(xì)解析
這篇文章主要介紹了Java線程實(shí)現(xiàn)的三種方式詳細(xì)解析,Java多線程實(shí)現(xiàn)方式主要有三種,繼承Thread類、實(shí)現(xiàn)Runnable接口、使用ExecutorService、Callable、Future實(shí)現(xiàn)有返回結(jié)果的多線程,需要的朋友可以參考下2023-12-12Java線程池中的Future實(shí)現(xiàn)詳解
這篇文章主要介紹了Java線程池中的Future實(shí)現(xiàn)詳解, FutureTask是一個(gè)任務(wù),FutureTask繼承了Runnable、Callable, 通過(guò)FutureTask可以獲取到任務(wù)執(zhí)行的狀態(tài),任務(wù)執(zhí)行完成完成后,將結(jié)構(gòu)通過(guò)Future接口返回,調(diào)用者可以調(diào)用Future#get()方法獲取到數(shù)據(jù),需要的朋友可以參考下2023-10-10