springboot 2.x源碼筆記- 配置文件加載 ConfigFileApplicationListener

springboot的源碼(spring)主要分為幾個部分

1惠勒、構(gòu)造SpringApplication,完成spring.factories文件中Initializers與Listeners的加載
2、加載配置文件爱致,通過ConfigFileApplicationListener
3、加載BeanDefinitionRegistryPostProcessor與BeanFactoryPostProcessor完成bean的定義包裝(非生成實例)
4、生成bean實例以及初始化

本文主要針對第二點嘱么,主要看如何加載配置文件,即如何加載環(huán)境信息顽悼,主要通過ConfigFileApplicationListener完成

基于springboot2.1.4

項目地址:https://gitee.com/eshin/springbootdemo.git#autotest

org.springframework.boot.SpringApplication#run(java.lang.String...)-->org.springframework.boot.SpringApplication#prepareEnvironment

該方法主要看兩部分

  • 1曼振、系統(tǒng)環(huán)境信息配置初始化加載org.springframework.boot.SpringApplication#getOrCreateEnvironment

有圖可以看出几迄,在構(gòu)造StandardServletEnvironment的時候,父類的構(gòu)造器依次執(zhí)行冰评,構(gòu)造后的StandardServletEnvironment就包含了如下的propertySource映胁,主要是系統(tǒng)參數(shù)
  • 2、發(fā)布environmentPrepared事件甲雅,ConfigFileApplicationListener監(jiān)聽到后執(zhí)行

environmentPrepared事件的發(fā)布解孙,此處不做詳述,可參考此處,其中監(jiān)聽到事件的Listener就有ConfigFileApplicationListener抛人,其實現(xiàn)了EnvironmentPostProcessor接口和SmartApplicationListener接口弛姜。
因此在org.springframework.boot.context.config.ConfigFileApplicationListener#onApplicationEnvironmentPreparedEvent遍歷執(zhí)行EnvironmentPostProcessor的時候,就會執(zhí)行到org.springframework.boot.context.config.ConfigFileApplicationListener#postProcessEnvironment妖枚,然后通過org.springframework.boot.context.config.ConfigFileApplicationListener#addPropertySources執(zhí)行到org.springframework.boot.context.config.ConfigFileApplicationListener.Loader#load()


在上圖中廷臼,this.propertySourceLoaders在spring.factories中配置,可自定義loader并配置绝页。

  • initializeProfiles();中會根據(jù)系統(tǒng)參數(shù)設(shè)置activeProfiles,如果有設(shè)置的話荠商,沒有就只有default一個⌒可以在運行springboot項目的時候設(shè)置spring.profiles.active莱没,或者spring.profiles.include。本文的前提是沒有在系統(tǒng)參數(shù)中設(shè)置這兩個變量屈芜,流程差不多郊愧,就是在this.profiles.poll()多走幾個循環(huán)而已。
  • 進入org.springframework.boot.context.config.ConfigFileApplicationListener.Loader#load(Profile profile, DocumentFilterFactory filterFactory,DocumentConsumer consumer)
  • 進入org.springframework.boot.context.config.ConfigFileApplicationListener.Loader#loadForFileExtension->org.springframework.boot.context.config.ConfigFileApplicationListener.Loader#load(PropertySourceLoader loader, String location, Profile profile,DocumentFilter filter, DocumentConsumer consumer)


    圖中中間位置

    其中List<Document> documents = loadDocuments(loader, name, resource);

    然后回到load方法中

最終通過loaded.forEach((document) -> consumer.accept(profile, document));將加載到的配置放入environment的properSourceList中


其中MutablePropertySources::addLast的方法引用方式比較少見井佑,可參考此處

至此属铁,整個environment的配置加載過程就完成了。

3躬翁、配置項的注入

配置項的注入是要等到bean的實例化后初始化階段焦蘑,參考這里.實例化后,會通過org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#postProcessProperties-->org.springframework.beans.factory.annotation.InjectionMetadata#inject--->org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.AutowiredMethodElement#inject--->org.springframework.beans.factory.support.DefaultListableBeanFactory#resolveDependency--->org.springframework.beans.factory.support.DefaultListableBeanFactory#doResolveDependency


--->org.springframework.beans.factory.support.AbstractBeanFactory#resolveEmbeddedValue然后進入org.springframework.context.support.PropertySourcesPlaceholderConfigurer#processProperties(org.springframework.beans.factory.config.ConfigurableListableBeanFactory, org.springframework.core.env.ConfigurablePropertyResolver)中已經(jīng)定義的StringValueResolver
PropertySourcesPlaceholderConfigurer實現(xiàn)了BeanFactoryPostProcessor的postProcessBeanFactory接口方法盒发,在bean的定義階段就已經(jīng)執(zhí)行其實現(xiàn)的接口方法例嘱,將StringValueResolver添加到beanFactory的embeddedValueResolvers中
進入StringValueResolver--->org.springframework.core.env.AbstractPropertyResolver#resolveRequiredPlaceholders-->org.springframework.core.env.AbstractPropertyResolver#doResolvePlaceholders-->org.springframework.util.PropertyPlaceholderHelper#replacePlaceholders(java.lang.String, org.springframework.util.PropertyPlaceholderHelper.PlaceholderResolver)-->org.springframework.util.PropertyPlaceholderHelper#parseStringValue
--->org.springframework.core.env.PropertySourcesPropertyResolver#getPropertyAsRawString

總結(jié):

  • 1、當系統(tǒng)啟動參數(shù)中配置指定的目錄spring.config.location宁舰,和文件名spring.config.name拼卵,則直接從讀取改配置文件,否則使用默認路徑蛮艰,查找順序為file:./config/腋腮,file:./,classpath:/config/,classpath:/即寡,默認文件名為application徊哑。
  • 2、只要加載的配置文件中包含spring.profiles.active,且對應(yīng)的文件沒有加載過聪富,那下次循環(huán)中就會繼續(xù)加載對應(yīng)的配置文件莺丑。
  • 3、每個實現(xiàn)org.springframework.boot.env.PropertySourceLoader的loader墩蔓,都需要指定對應(yīng)支持的拓展名梢莽。
  • 4、若有多個loader對相同拓展名的配置文件處理钢拧,優(yōu)先級高的loader加載蟹漓,后續(xù)的loader處理時略過。
  • 5源内、讀取配置時從propertySourceList中按順序查找,先放入list中的source中讀到了配置份殿,就不往后面查找膜钓,因此配置的生效順序為:系統(tǒng)參數(shù)->file:./config/ -> file:./ -> classpath:/config/ -> classpath:/
    指定了profile的要比沒有指定的優(yōu)先。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卿嘲,一起剝皮案震驚了整個濱河市颂斜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拾枣,老刑警劉巖沃疮,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異梅肤,居然都是意外死亡司蔬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門姨蝴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俊啼,“玉大人,你說我怎么就攤上這事左医∈谂粒” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵浮梢,是天一觀的道長跛十。 經(jīng)常有香客問我,道長秕硝,這世上最難降的妖魔是什么芥映? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上屏轰,老公的妹妹穿的比我還像新娘颊郎。我一直安慰自己,他們只是感情好霎苗,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布姆吭。 她就那樣靜靜地躺著,像睡著了一般唁盏。 火紅的嫁衣襯著肌膚如雪内狸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天厘擂,我揣著相機與錄音昆淡,去河邊找鬼。 笑死刽严,一個胖子當著我的面吹牛昂灵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舞萄,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼眨补,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了倒脓?” 一聲冷哼從身側(cè)響起撑螺,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎崎弃,沒想到半個月后甘晤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡饲做,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年线婚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艇炎。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡酌伊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缀踪,到底是詐尸還是另有隱情居砖,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布驴娃,位于F島的核電站奏候,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏唇敞。R本人自食惡果不足惜蔗草,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一咒彤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咒精,春花似錦镶柱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至范咨,卻和暖如春故觅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渠啊。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工输吏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人替蛉。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓贯溅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親灭返。 傳聞我的和親對象是個殘疾皇子盗迟,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354