Spring Boot對(duì)于如何使用Spring構(gòu)建應(yīng)用程序有一個(gè)看法:例如它具有常規(guī)配置文件的常規(guī)位置,以及用于常見管理和監(jiān)視任務(wù)的端點(diǎn)。Spring Cloud建立在此之上,并添加了一些可能系統(tǒng)中所有組件將使用或偶爾需要的功能骆撇。
引導(dǎo)應(yīng)用程序上下文
一個(gè)Spring Cloud應(yīng)用程序通過(guò)創(chuàng)建一個(gè)“引導(dǎo)”上下文來(lái)進(jìn)行操作,這個(gè)上下文是主應(yīng)用程序的父上下文。開箱即用拱燃,負(fù)責(zé)從外部源加載配置屬性,還解密本地外部配置文件中的屬性力惯。這兩個(gè)上下文共享一個(gè)Environment碗誉,這是任何Spring應(yīng)用程序的外部屬性的來(lái)源。Bootstrap屬性的優(yōu)先級(jí)高父晶,因此默認(rèn)情況下不能被本地配置覆蓋哮缺。
引導(dǎo)上下文使用與主應(yīng)用程序上下文不同的外部配置約定,因此使用bootstrap.ymlapplication.yml(或.properties)代替引導(dǎo)和主上下文的外部配置甲喝。例:
bootstrap.yml
spring:
? application:
? ? name: foo
? cloud:
? ? config:
? ? ? uri: ${SPRING_CONFIG_URI:http://localhost:8888}
如果您的應(yīng)用程序需要服務(wù)器上的特定于應(yīng)用程序的配置尝苇,那么設(shè)置spring.application.name(在bootstrap.yml或application.yml)中是個(gè)好主意。
您可以通過(guò)設(shè)置spring.cloud.bootstrap.enabled=false(例如在系統(tǒng)屬性中)來(lái)完全禁用引導(dǎo)過(guò)程。
應(yīng)用程序上下文層次結(jié)構(gòu)
如果您從SpringApplication或SpringApplicationBuilder構(gòu)建應(yīng)用程序上下文茎匠,則將Bootstrap上下文添加為該上下文的父級(jí)格仲。這是一個(gè)Spring的功能,即子上下文從其父進(jìn)程繼承屬性源和配置文件诵冒,因此與不使用Spring Cloud Config構(gòu)建相同上下文相比凯肋,“主”應(yīng)用程序上下文將包含其他屬性源。額外的財(cái)產(chǎn)來(lái)源是:
“bootstrap”:如果在Bootstrap上下文中找到任何PropertySourceLocators汽馋,則可選CompositePropertySource顯示為高優(yōu)先級(jí)侮东,并且具有非空屬性。一個(gè)例子是來(lái)自Spring Cloud Config服務(wù)器的屬性豹芯。有關(guān)如何自定義此屬性源的內(nèi)容的說(shuō)明悄雅,請(qǐng)參閱下文。
“applicationConfig:[classpath:bootstrap.yml]”(如果Spring配置文件處于活動(dòng)狀態(tài)铁蹈,則為朋友)宽闲。如果您有一個(gè)bootstrap.yml(或?qū)傩裕敲催@些屬性用于配置引導(dǎo)上下文握牧,然后在父進(jìn)程設(shè)置時(shí)將它們添加到子上下文中容诬。它們的優(yōu)先級(jí)低于application.yml(或?qū)傩裕┮约白鳛閯?chuàng)建Spring Boot應(yīng)用程序的過(guò)程的正常部分添加到子級(jí)的任何其他屬性源。有關(guān)如何自定義這些屬性源的內(nèi)容的說(shuō)明沿腰,請(qǐng)參閱下文览徒。
由于屬性源的排序規(guī)則,“引導(dǎo)”條目?jī)?yōu)先颂龙,但請(qǐng)注意习蓬,這些條目不包含來(lái)自bootstrap.yml的任何數(shù)據(jù),它具有非常低的優(yōu)先級(jí)措嵌,但可用于設(shè)置默認(rèn)值躲叼。
您可以通過(guò)簡(jiǎn)單地設(shè)置您創(chuàng)建的任何ApplicationContext的父上下文來(lái)擴(kuò)展上下文層次結(jié)構(gòu),例如使用自己的界面铅匹,或使用SpringApplicationBuilder方便方法(parent()押赊,child()和sibling())。引導(dǎo)環(huán)境將是您創(chuàng)建自己的最高級(jí)祖先的父級(jí)包斑。層次結(jié)構(gòu)中的每個(gè)上下文都將有自己的“引導(dǎo)”屬性源(可能為空),以避免無(wú)意中將值從父級(jí)升級(jí)到其后代涕俗。層次結(jié)構(gòu)中的每個(gè)上下文(原則上)也可以具有不同的spring.application.name罗丰,因此如果存在配置服務(wù)器,則不同的遠(yuǎn)程屬性源再姑。普通的Spring應(yīng)用程序上下文行為規(guī)則適用于屬性解析:子環(huán)境中的屬性通過(guò)名稱和屬性源名稱覆蓋父項(xiàng)中的屬性(如果子級(jí)具有與父級(jí)名稱相同的屬性源萌抵,一個(gè)來(lái)自父母的孩子不包括在孩子中)。
請(qǐng)注意,SpringApplicationBuilder允許您在整個(gè)層次結(jié)構(gòu)中共享Environment绍填,但這不是默認(rèn)值霎桅。因此,兄弟情境尤其不需要具有相同的資料或財(cái)產(chǎn)來(lái)源讨永,盡管它們與父母共享共同點(diǎn)滔驶。