前言
開心一刻
朋友喜歡去×××,第一次推門進來的是一個學(xué)生美眉,感覺還不錯;后來經(jīng)常去,有時是護士,有時是空姐,有時候是教師。昨天晚上推門進去的是一個女警察,長得賊好看,身材也很好,朋友嗷的一聲就撲上去了。然后他就被抓起來了,罪名是:×××、襲警、強奸未遂。
路漫漫其修遠兮,吾將上下而求索!
github:https://github.com/youzhibing
碼云(gitee):https://gitee.com/youzhibing
回到頂部
前情回顧
springboot2.3源碼篇之SpringApplication的構(gòu)造方法
主要做了兩件事:
1、推測應(yīng)用類型
根據(jù)類路徑下是否存在指定類型的類來斷定應(yīng)用類型;
應(yīng)用類型有三種:NONE、SERVLET、REACTIVE,NONO表示普通的java應(yīng)用,SERVLET表示基于servlet 的web工程,REACTIVE表示 reactive web application(還沒去了解,囧...)
2、獲取ApplicationContextInitializer、ApplicationListener實例
查找類路徑下全部的META-INF/spring.factories的URL(spring.factories文件的路徑),并加載所有spring.factories中的內(nèi)容(包括各種Initializer、ApplicationListener、AutoConfigure、Failure analyzers等)到SpringFactoriesLoader的cache中;
然后從緩存中獲取ApplicationContextInitializer、ApplicationListener類型的類并進行實例化,然后將得到的實例化集合分別賦值給SpringApplication的initializers和listeners
springboot2.3源碼篇之run方法(一):SpringApplicationRunListener
主要做了兩件事:
1、準(zhǔn)備好運行時監(jiān)聽器:EventPublishingRunListener,并過濾出于與ApplicationStartingEvent匹配的監(jiān)聽器
2、廣播ApplicationStartingEvent事件,觸發(fā)對應(yīng)的事件監(jiān)聽器
LoggingApplicationListener
檢測正在使用的日志系統(tǒng)
BackgroundPreinitializer
另起一個后臺線程執(zhí)行耗時的初始化
springboot2.3源碼篇之run方法(二):prepareEnvironment方法
1、獲取或創(chuàng)建環(huán)境
根據(jù)SpringApplication構(gòu)造方法中推斷出的應(yīng)用類型創(chuàng)建對應(yīng)的環(huán)境,一般而言是web環(huán)境:StandardServletEnvironment
2、廣播ApplicationEnvironmentPreparedEvent事件,觸發(fā)相應(yīng)的監(jiān)聽器
ConfigFileApplicationListener
添加名叫random的RandomValuePropertySource到environment
添加名叫applicationConfig:[classpath:/application.yml]的OriginTrackedMapPropertySource到environment
LoggingApplicationListener
初始化日志系統(tǒng)
3、加載外部化配置的資源到environment
包括命令行參數(shù)、servletConfigInitParams、servletContextInitParams、systemProperties、sytemEnvironment、random、application.yml(.yaml/.xml/.properties)等
springboot2.3源碼篇之run方法(三):createApplicationContext方法
1、實例化應(yīng)用上下文
應(yīng)用類型有三種,對應(yīng)的上下文也有三種,NONE -> AnnotationConfigApplicationContext,SERVLET -> AnnotationConfigServletWebServerApplicationContext,REACTIVE -> AnnotationConfigReactiveWebServerApplicationContext;一般而言,創(chuàng)建的是AnnotationConfigServletWebServerApplicationContext。
2、實例化AnnotatedBeanDefinitionReader、ClassPathBeanDefinitionScanner和DefaultListableBeanFactory
AnnotatedBeanDefinitionReader是注解bean定義讀取器,用于編程式注解bean的注冊;ClassPathBeanDefinitionScanner是類路徑bean定義掃描器,用于檢測類路徑上的bean候選者。
AnnotatedBeanDefinitionReade用來加載class類型的配置,在它初始化的時候,會預(yù)先注冊一些BeanPostProcessor和BeanFactoryPostProcessor,這些處理器會在接下來的spring初始化流程中被調(diào)用。ClassPathBeanDefinitionScanner是一個掃描指定類路徑中注解Bean定義的掃描器,在它初始化的時候,會初始化一些需要被掃描的注解。
DefaultListableBeanFactory,也就是我們所說的beanFactory,用來注冊所有bean定義(bean definitions),也可以用來作為單例bean工廠。
springboot2.3源碼篇之run方法(四):prepareContext方法
1、將SpringApplication中的部分屬性應(yīng)用到上下文中
SpringApplication中的environment、initializers、listeners應(yīng)用到spring上下文中
2、廣播ApplicationPreparedEvent事件,觸發(fā)對應(yīng)的事件監(jiān)聽器
向context的beanFactoryPostProcessors中注冊了一個PropertySourceOrderingPostProcessor實例
向beanFactory中注冊了一個名叫springBootLoggingSystem的單例bean,也就是我們的日志系統(tǒng)bean
3、加載資源
支持4種方式:Class、Resource、Package和CharSequence。
Class:注解形式的Bean定義;AnnotatedBeanDefinitionReader負責(zé)處理。
Resource:一般而言指的是xml bean配置文件,也就是我們在spring中常用的xml配置。說的簡單點就是:將xml的bean定義封裝成BeanDefinition并注冊到beanFactory的BeanDefinitionMap中;XmlBeanDefinitionReader負責(zé)處理。
Package:以掃包的方式掃描bean定義; ClassPathBeanDefinitionScanner負責(zé)處理。
CharSequence:以先后順序進行匹配Class、Resource或Package進行加載,誰匹配上了就用誰的處理方式處理。
springboot鼓勵用java類實現(xiàn)java bean定義,所以springboot應(yīng)用中,我們一般只需要關(guān)注Class方式、Package方式即可。
context中主要是三個屬性增加了內(nèi)容:beanFactory、beanFactoryPostProcessors和applicationListeners
回到頂部
三個事件
ApplicationStartingEvent
在監(jiān)聽器注冊完、SpringApplication構(gòu)造完后,以及其他的任何處理之前被廣播,觸發(fā)對應(yīng)的事件監(jiān)聽器
ApplicationEnvironmentPreparedEvent
environment創(chuàng)建后,context創(chuàng)建之前被廣播,觸發(fā)對應(yīng)的事件監(jiān)聽器
ApplicationPreparedEvent
bean定義加載后,上下文refresh之前被廣播,觸發(fā)對應(yīng)的事件監(jiān)聽器
后續(xù)還會涉及到ApplicationReadyEvent、ApplicationFailedEvent事件,后續(xù)再詳解
關(guān)于事件機制,可到此處查看更多詳情
回到頂部
三個核心
SpringApplication
springboot的特性之一,內(nèi)容如下
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方法引導(dǎo)和啟動Spring應(yīng)用程序。其實給我印象最深的還是從spring.factories加載一系列的類,包括Initializer、ApplicationListener、AutoConfigure、Failure analyzers等等,springboot的自動配置,從此時已經(jīng)開始了,一系列的AutoConfigure都是從spring.factories獲取的。
environment:StandardServletEnvironment
表示當(dāng)前應(yīng)用程序所處的環(huán)境,主要包括兩方面:profiles和properties;例如我們經(jīng)常說的本地、運測、預(yù)發(fā)布、生產(chǎn)環(huán)境,就可以通過environment進行配置,以及是否是web環(huán)境。
一般而言,我們的環(huán)境是StandardServletEnvironment,標(biāo)準(zhǔn)的servlet環(huán)境,也就是我們經(jīng)常說的web環(huán)境
ApplicationContext:AnnotationConfigServletWebServerApplicationContext
應(yīng)用上下文,用于為應(yīng)用程序提供配置的中央接口,提供如下內(nèi)容:
1、訪問應(yīng)用程序組件的Bean工廠方法
2、加載文件資源的能力
3、發(fā)布事件到已注冊的事件監(jiān)聽器的能力
4、解析消息,支持國際化的能力
等等一系列的功能
AnnotationConfigServletWebServerApplicationContext是springboot對spring應(yīng)用上下文的拓展,引入了一些springboot的內(nèi)容。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。