spring-boot-2.0.3不一樣系列之源碼篇 - 階段總結

前言

  開心一刻

    朋友喜歡去按摩庄新,第一次推門進來的是一個學生美眉,感覺還不錯薯鼠;后來經常去,有時是護士械蹋,有時是空姐出皇,有時候是教師。昨天晚上推門進去的是一個女警察哗戈,長得賊好看郊艘,身材也很好,朋友嗷的一聲就撲上去了唯咬。然后他就被抓起來了纱注,罪名是:嫖娼、襲警胆胰、強奸未遂狞贱。

  路漫漫其修遠兮,吾將上下而求索蜀涨!

github:https://github.com/youzhibing

碼云(gitee):https://gitee.com/youzhibing

回到頂部

前情回顧

springboot2.3源碼篇之SpringApplication的構造方法

    主要做了兩件事:

    1瞎嬉、推測應用類型

      根據類路徑下是否存在指定類型的類來斷定應用類型;

      應用類型有三種:NONE厚柳、SERVLET氧枣、REACTIVE,NONO表示普通的java應用别垮,SERVLET表示基于servlet 的web工程便监,REACTIVE表示 reactive web application(還沒去了解,囧...)

    2碳想、獲取ApplicationContextInitializer烧董、ApplicationListener實例

      查找類路徑下全部的META-INF/spring.factories的URL(spring.factories文件的路徑),并加載所有spring.factories中的內容(包括各種Initializer移袍、ApplicationListener解藻、AutoConfigure、Failure analyzers等)到SpringFactoriesLoader的cache中葡盗;

      然后從緩存中獲取ApplicationContextInitializer螟左、ApplicationListener類型的類并進行實例化啡浊,然后將得到的實例化集合分別賦值給SpringApplication的initializers和listeners

springboot2.3源碼篇之run方法(一):SpringApplicationRunListener

    主要做了兩件事:

    1、準備好運行時監(jiān)聽器:EventPublishingRunListener胶背,并過濾出于與ApplicationStartingEvent匹配的監(jiān)聽器

    2巷嚣、廣播ApplicationStartingEvent事件,觸發(fā)對應的事件監(jiān)聽器

      LoggingApplicationListener

        檢測正在使用的日志系統

      BackgroundPreinitializer

        另起一個后臺線程執(zhí)行耗時的初始化

springboot2.3源碼篇之run方法(二):prepareEnvironment方法

    1钳吟、獲取或創(chuàng)建環(huán)境

      根據SpringApplication構造方法中推斷出的應用類型創(chuàng)建對應的環(huán)境廷粒,一般而言是web環(huán)境:StandardServletEnvironment

    2、廣播ApplicationEnvironmentPreparedEvent事件红且,觸發(fā)相應的監(jiān)聽器

      ConfigFileApplicationListener

        添加名叫random的RandomValuePropertySource到environment

        添加名叫applicationConfig:[classpath:/application.yml]的OriginTrackedMapPropertySource到environment

      LoggingApplicationListener

        初始化日志系統

    3坝茎、加載外部化配置的資源到environment

      包括命令行參數、servletConfigInitParams暇番、servletContextInitParams嗤放、systemProperties、sytemEnvironment壁酬、random次酌、application.yml(.yaml/.xml/.properties)等

springboot2.3源碼篇之run方法(三):createApplicationContext方法

    1、實例化應用上下文

      應用類型有三種舆乔,對應的上下文也有三種岳服,NONE ->?AnnotationConfigApplicationContext,SERVLET ->?AnnotationConfigServletWebServerApplicationContext希俩,REACTIVE ->?AnnotationConfigReactiveWebServerApplicationContext吊宋;一般而言,創(chuàng)建的是AnnotationConfigServletWebServerApplicationContext斜纪。

    2贫母、實例化AnnotatedBeanDefinitionReader、ClassPathBeanDefinitionScanner和DefaultListableBeanFactory

      AnnotatedBeanDefinitionReader是注解bean定義讀取器盒刚,用于編程式注解bean的注冊腺劣;ClassPathBeanDefinitionScanner是類路徑bean定義掃描器,用于檢測類路徑上的bean候選者因块。

      AnnotatedBeanDefinitionReade用來加載class類型的配置橘原,在它初始化的時候,會預先注冊一些BeanPostProcessor和BeanFactoryPostProcessor涡上,這些處理器會在接下來的spring初始化流程中被調用趾断。ClassPathBeanDefinitionScanner是一個掃描指定類路徑中注解Bean定義的掃描器,在它初始化的時候吩愧,會初始化一些需要被掃描的注解芋酌。

      DefaultListableBeanFactory,也就是我們所說的beanFactory雁佳,用來注冊所有bean定義(bean definitions)脐帝,也可以用來作為單例bean工廠同云。

springboot2.3源碼篇之run方法(四):prepareContext方法

    1又跛、將SpringApplication中的部分屬性應用到上下文中

      SpringApplication中的environment初坠、initializers、listeners應用到spring上下文中

    2吁讨、廣播ApplicationPreparedEvent事件疚顷,觸發(fā)對應的事件監(jiān)聽器

向context的beanFactoryPostProcessors中注冊了一個PropertySourceOrderingPostProcessor實例

向beanFactory中注冊了一個名叫springBootLoggingSystem的單例bean旱易,也就是我們的日志系統bean

    3、加載資源

      支持4種方式:Class腿堤、Resource阀坏、Package和CharSequence。

        Class:注解形式的Bean定義笆檀;AnnotatedBeanDefinitionReader負責處理全释。

        Resource:一般而言指的是xml bean配置文件,也就是我們在spring中常用的xml配置误债。說的簡單點就是:將xml的bean定義封裝成BeanDefinition并注冊到beanFactory的BeanDefinitionMap中;XmlBeanDefinitionReader負責處理妄迁。

        Package:以掃包的方式掃描bean定義寝蹈; ClassPathBeanDefinitionScanner負責處理。

        CharSequence:以先后順序進行匹配Class登淘、Resource或Package進行加載箫老,誰匹配上了就用誰的處理方式處理。

      springboot鼓勵用java類實現java bean定義黔州,所以springboot應用中耍鬓,我們一般只需要關注Class方式、Package方式即可流妻。

    context中主要是三個屬性增加了內容:beanFactory牲蜀、beanFactoryPostProcessors和applicationListeners

回到頂部

三個事件

  ApplicationStartingEvent

    在監(jiān)聽器注冊完、SpringApplication構造完后绅这,以及其他的任何處理之前被廣播涣达,觸發(fā)對應的事件監(jiān)聽器

  ApplicationEnvironmentPreparedEvent

environment創(chuàng)建后,context創(chuàng)建之前被廣播证薇,觸發(fā)對應的事件監(jiān)聽器

ApplicationPreparedEvent

    bean定義加載后度苔,上下文refresh之前被廣播,觸發(fā)對應的事件監(jiān)聽器

  后續(xù)還會涉及到ApplicationReadyEvent浑度、ApplicationFailedEvent事件寇窑,后續(xù)再詳解

關于事件機制,可到此處查看更多詳情

回到頂部

三個核心

SpringApplication

    springboot的特性之一箩张,內容如下

23. SpringApplication

23.1. Startup Failure

23.2. Customizing the Banner

23.3. Customizing SpringApplication

23.4. Fluent Builder API

23.5. Application Events and Listeners

23.6. Web Environment

23.7. Accessing Application Arguments

23.8. Using the ApplicationRunner or CommandLineRunner

23.9. Application Exit

23.10. Admin Features

也是springboot中比較重要的特性之一甩骏,用于從java main方法引導和啟動Spring應用程序窗市。其實給我印象最深的還是從spring.factories加載一系列的類,包括Initializer横漏、ApplicationListener谨设、AutoConfigure、Failure analyzers等等缎浇,springboot的自動配置扎拣,從此時已經開始了,一系列的AutoConfigure都是從spring.factories獲取的素跺。

environment:StandardServletEnvironment

    表示當前應用程序所處的環(huán)境二蓝,主要包括兩方面:profiles和properties;例如我們經常說的本地指厌、運測刊愚、預發(fā)布、生產環(huán)境踩验,就可以通過environment進行配置鸥诽,以及是否是web環(huán)境。

    一般而言箕憾,我們的環(huán)境是StandardServletEnvironment牡借,標準的servlet環(huán)境,也就是我們經常說的web環(huán)境

  ApplicationContext:AnnotationConfigServletWebServerApplicationContext

    應用上下文袭异,用于為應用程序提供配置的中央接口钠龙,提供如下內容:

      1、訪問應用程序組件的Bean工廠方法

      2御铃、加載文件資源的能力

      3碴里、發(fā)布事件到已注冊的事件監(jiān)聽器的能力

      4、解析消息上真,支持國際化的能力

      等等一系列的功能

    AnnotationConfigServletWebServerApplicationContext是springboot對spring應用上下文的拓展咬腋,引入了一些springboot的內容。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末谷羞,一起剝皮案震驚了整個濱河市帝火,隨后出現的幾起案子,更是在濱河造成了極大的恐慌湃缎,老刑警劉巖犀填,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異嗓违,居然都是意外死亡九巡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門蹂季,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冕广,“玉大人疏日,你說我怎么就攤上這事∪龊海” “怎么了沟优?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長睬辐。 經常有香客問我挠阁,道長,這世上最難降的妖魔是什么溯饵? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任侵俗,我火速辦了婚禮,結果婚禮上丰刊,老公的妹妹穿的比我還像新娘隘谣。我一直安慰自己,他們只是感情好啄巧,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布寻歧。 她就那樣靜靜地躺著,像睡著了一般秩仆。 火紅的嫁衣襯著肌膚如雪熄求。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天逗概,我揣著相機與錄音,去河邊找鬼忘衍。 笑死逾苫,一個胖子當著我的面吹牛,可吹牛的內容都是我干的枚钓。 我是一名探鬼主播铅搓,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼搀捷!你這毒婦竟也來了星掰?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嫩舟,失蹤者是張志新(化名)和其女友劉穎氢烘,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體家厌,經...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡播玖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了饭于。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜀踏。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡维蒙,死狀恐怖,靈堂內的尸體忽然破棺而出果覆,到底是詐尸還是另有隱情颅痊,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布局待,位于F島的核電站斑响,受9級特大地震影響,放射性物質發(fā)生泄漏燎猛。R本人自食惡果不足惜恋捆,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望重绷。 院中可真熱鬧沸停,春花似錦、人聲如沸昭卓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽候醒。三九已至能颁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間倒淫,已是汗流浹背伙菊。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留敌土,地道東北人镜硕。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像返干,于是被迫代替她去往敵國和親兴枯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內容