springboot從**開始載入配置檔案?
springboot從哪些地方載入配置檔案?
springboot是如何支援yaml
和properties
型別的配置檔案?
如果要支援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的實現類:
看名字就知道是分別負責properties
和yaml
的啦。
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通過
propertysource
和propertysources
實現屬性優先順序、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...