SpringBoot是如何載入配置檔案的?

2022-03-26 21:05:58 字數 4335 閱讀 5453

springboot從**開始載入配置檔案?

springboot從哪些地方載入配置檔案?

springboot是如何支援yamlproperties型別的配置檔案?

如果要支援json配置應該如何做?

springboot的配置優先順序是怎麼樣的?

placeholder是如何被解析的?

帶著我們的問題一起去看一下springboot配置相關的源**,找出問題的答案。

... ...

}...

private final log log;

this.log = log;

this.listeners = new arraylist<>(listeners); }

void environmentprepared(configurableenvironment environment)

} ...}}

# run listeners

org.springframework.boot.context.event.eventpublishingrunlistener

小結

private static final string default_search_locations = "classpath:/,classpath:/config/,file:./,file:./config/";
首先在沒有任何配置的情況下,會從default_search_locations常量列出來的位置中載入檔名為default_names(.properties或yml)的檔案,預設位置包括:

private setgetsearchlocations() 

setlocations = getsearchlocations(config_additional_location_property);

locations.addall(

return locations;

}

它的操作步驟大致如下:

檢查是否有spring.config.location屬性,如果存在則直接使用它的值

spring.config.additional-location屬性中獲取搜尋路徑

將預設搜尋路徑新增到搜尋集合

這裡就可以確定springboot配置的搜尋路徑有兩種情況:如果配置了spring.config.location則直接使用,否則使用spring.config.additional-location的屬性值 + 預設搜尋路徑。

loader(configurableenvironment environment, resourceloader resourceloader)
構造loader物件的時候就會先載入propertysourceloader,載入方式還是從spring.factories中讀取:

# propertysource loaders

org.springframework.boot.env.propertysourceloader=\

org.springframework.boot.env.propertiespropertysourceloader,\

org.springframework.boot.env.yamlpropertysourceloader

其中配置了兩個propertysourceloader的實現類:

看名字就知道是分別負責propertiesyaml的啦。

public class jsonpropertysourceloader implements propertysourceloader ;

}@override

public list> load(string name, resource resource) throws ioexception

mapconfigs = json.parseobject(resource.getinputstream(), map.class);

return collections.singletonlist();}

}

然後在resources目錄裡面建立個meta-inf,再新增個spring.factories裡面的內容如下:

org.springframework.boot.env.propertysourceloader=\

com.csbaic.arch.spring.env.loader.jsonpropertysourceloader

springboot中有個propertysource介面,專門用來儲存屬性常見的實現類有:

另外為了集中管理propertysource還抽象出乙個propertysources介面,propertysources就乙個實現類叫:mutablepropertysources,它將所有的propertysource都放置在乙個名叫propertysourcelist集合中,同時提供一些修改操作方法:

public void addfirst(propertysource> propertysource) {}

public void addlast(propertysource> propertysource) {}

public void addbefore(string relativepropertysourcename, propertysource> propertysource) {}

public void addafter(string relativepropertysourcename, propertysource> propertysource) {}

public int precedenceof(propertysource> propertysource)

public propertysource> remove(string name) {}

public void replace(string name, propertysource> propertysource) {}

所有的propertysource都儲存在propertysourcelist中,越小的索引優先順序越高,所以如果想要覆蓋屬性只要保證優化級夠高就行。

loader(configurableenvironment environment, resourceloader resourceloader)
分析propertysourcesplaceholdersresolver發現,真正完成解析是由propertyplaceholderhelper完成,propertysourcesplaceholdersresolver 在構造的時候就會建立乙個propertyplaceholderhelper

public propertysourcesplaceholdersresolver(iterable> sources, propertyplaceholderhelper helper)
propertysourcesplaceholdersresolver 在建立 propertyplaceholderhelper 的時候會傳遞三個引數:字首、字尾、預設值分割符,分別由以下三個常量表示:

public static final string placeholder_prefix = "$";

public static final string value_separator = ":";

springboot的配置非常靈活配置可以來自檔案、環境變數、jvm系統屬性、配置中心等等,springboot通過

propertysourcepropertysources實現屬性優先順序、crud的統一管理,為開發者提供統一的配置抽象。

《架構文摘》每天一篇架構領域重磅好文,涉及一線網際網路公司應用架構(高可用、高性 能、高穩定)、大資料、機器學習等各個熱門領域。

springboot,是如何啟動的

public static void main string args 總結 springboot所有自動配置都是在啟動的時候自動掃瞄並且載入 meta inf spring.factories所有的自動配置類都在這個檔案裡面.但是不一定生效,要判斷條件是否城裡,只要匯入了對應的start,就有對應...

springboot中,如何從資源檔案載入檔案

核心還是io操作,主要包括以下兩個 public jsoninformationhereasreturntype getjsoncontent before public voidt1 catch ioexception e 在本地環境下,resourceutils 可以正常讀取到我需要的檔案,但是...

springboot自動配置是如何實現的?

什麼是springboot自動配置?springboot的自動配置,指的是springboot會自動將一些配置類的bean註冊進ioc容器,我們可以需要的地方使用 autowired或者 resource等註解來使用它。自動 的表現形式就是我們只需要引我們想用功能的包,相關的配置我們完全不用管,sp...