SpringBoot不讀取bootstrap.yml/properties文件問題
SpringBoot不讀取bootstrap.yml/properties文件
今天寫創(chuàng)建了一個(gè)SpringBoot項(xiàng)目,配置文件從其他項(xiàng)目拷貝了一份bootstrap.yml
之前一直用的application.yml
心想:application.yml 優(yōu)先級(jí)沒有bootstrap.yml 高,bootstrap配置文件肯定沒問題
項(xiàng)目一跑來,發(fā)現(xiàn)配置文件里面的內(nèi)容沒讀取到。
之后通過各種查資料,才明白了application.yml 和bootstrap.yml 的區(qū)別,不僅僅是優(yōu)先級(jí)的問題。
先說我的問題是什么原因吧
SpringBoot 項(xiàng)目中如果沒有依賴 spring-cloud-context 的話,是不會(huì)讀取bootstrap.properties 文件
也就是說
bootstrap.yml配置是SpringCloud項(xiàng)目才會(huì)用到的。
如果你的項(xiàng)目?jī)H僅是一個(gè)SpringBoot項(xiàng)目,只會(huì)識(shí)別application.yml配置文件。
由于SpringCloud是基于SpringBoot構(gòu)建的,所有SpringCloud項(xiàng)目?jī)煞N文件都會(huì)識(shí)別,這個(gè)時(shí)候才有優(yōu)先級(jí)的說法,SpringCloud項(xiàng)目是會(huì)優(yōu)先讀取bootstrap配置在讀取application配置。
引用Spring官網(wǎng)的一句話
A Spring Cloud application operates by creating a “bootstrap” context, which is a parent context for the main application. Out of the box it is responsible for loading configuration properties from the external sources, and also decrypting properties in the local external configuration files.
SpringCloud 應(yīng)用是基于 一個(gè) “bootstrap”的上下文運(yùn)行的。
也就說明了 bootstrap這個(gè)配置是SpringCloud 應(yīng)用才會(huì)用的。
什么配置在application配置?什么配置在bootstrap里面配置?
1、當(dāng)使用 Spring Cloud Config Server 的時(shí)候,spring.application.name 和 spring.cloud.config.server.git.uri應(yīng)該在 bootstrap.yml 里面指定
2、一些加密解密的配置也應(yīng)該配置在bootstrap里面
英文好的可以參考官網(wǎng)文章
SpringBoot中解析yml文件
springboot集成log4j2時(shí),需要將操作日志記錄到數(shù)據(jù)源。這需要自己編寫數(shù)據(jù)源連接信息。如下:
不太優(yōu)雅,數(shù)據(jù)源是在配置文件中是有配置,可是這里又需要配置一次,而且后期切換環(huán)境給運(yùn)維也增加挑戰(zhàn)。
怎么從配置文件獲取參數(shù)呢?甚至直接從容器中提取數(shù)據(jù)源?
@Value
? @Autowired
? getBean("dataSource")
?
nonono!!!
這很蛋疼了。springboot啟動(dòng)時(shí)最開始就需要加載日志配置中的數(shù)據(jù)源信息,可是這時(shí)候spring所有的bean都還未加載,也無法通過任何方式在spring容器中獲取參數(shù)配置。
咋搞?小弟不才,通過硬寫解析yml配置文件的方法獲取配置文件中的數(shù)據(jù)源配置信息。
添加依賴
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-yaml</artifactId> <version>2.11.2</version> </dependency>
新增工具類
import org.springframework.util.ResourceUtils; import org.yaml.snakeyaml.Yaml; import java.io.File; import java.io.FileReader; import java.io.Reader; import java.util.Map; public class YmlUtil { public static Map<String,Object> getYaml(String filePath){ Yaml yml = new Yaml(); Reader reader = null; try { // String filePath = ResourceUtils.getURL("classpath:").getPath() + "/application.yml"; reader = new FileReader(new File(filePath)); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return yml.loadAs(reader, Map.class); } public static Object getPropValue(Map<String,Object> map,String key){ Map<String,Object> temp = map; int length = key.split("\\.").length; for (int i = 0; i < length; i++) { if(i==length-1){ //葉子節(jié)點(diǎn)直接獲取 return temp.get(key.split("\\.")[i]); }else{ temp = (Map<String, Object>)temp.get(key.split("\\.")[i]); } } return null; } //使用方法 public static void main(String[] args) { try{ Map<String,Object> map = getYaml(ResourceUtils.getURL("classpath:").getPath() + "/application.yml"); Object val = getPropValue(map,"spring.profiles.active"); }catch (Exception e){ } } }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中Elasticsearch 實(shí)現(xiàn)分頁方式(三種方式)
Elasticsearch是用Java語言開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布,是一種流行的企業(yè)級(jí)搜索引擎,這篇文章主要介紹了Elasticsearch實(shí)現(xiàn)分頁的3種方式,需要的朋友可以參考下2022-07-07SpringBoot中通過AOP整合日志文件的實(shí)現(xiàn)
本文主要介紹了SpringBoot中通過AOP整合日志文件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12基于java中stack與heap的區(qū)別,java中的垃圾回收機(jī)制的相關(guān)介紹
本篇文章小編將為大家介紹,基于java中stack與heap的區(qū)別,java中的垃圾回收機(jī)制的相關(guān)介紹,需要的可以參考一下2013-04-04基于swagger參數(shù)與實(shí)體中參數(shù)不一致的原因分析
這篇文章主要介紹了基于swagger參數(shù)與實(shí)體中參數(shù)不一致的原因分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Java Swing JCheckBox復(fù)選框的實(shí)現(xiàn)方法
這篇文章主要介紹了Java Swing JCheckBox復(fù)選框的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Java AQS(AbstractQueuedSynchronizer)源碼解析
AbstractQueuedSynchronizer被稱為隊(duì)列同步器,簡(jiǎn)稱為大家熟知的AQS,這個(gè)類可以稱作concurrent包的基礎(chǔ)。本文將通過剖析源碼來看看AQS是如何工作的,感興趣的可以了解一下2023-02-02SpringBoot前后端接口對(duì)接常見錯(cuò)誤小結(jié)
SpringBoot前后端接口對(duì)接工作時(shí),經(jīng)常遇到請(qǐng)求500,400等問題,本文主要介紹了SpringBoot前后端接口對(duì)接常見錯(cuò)誤小結(jié),感興趣的可以了解一下2022-01-01