91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springboot2.0.6的運行流程以及怎么執行SpringApplication的run方法

發布時間:2021-09-04 11:13:35 來源:億速云 閱讀:274 作者:chen 欄目:大數據

這篇文章主要介紹“springboot2.0.6的運行流程以及怎么執行SpringApplication的run方法”,在日常操作中,相信很多人在springboot2.0.6的運行流程以及怎么執行SpringApplication的run方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”springboot2.0.6的運行流程以及怎么執行SpringApplication的run方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1. 啟動流程圖

springboot2.0.6的運行流程以及怎么執行SpringApplication的run方法

2. 啟動結構圖

springboot2.0.6的運行流程以及怎么執行SpringApplication的run方法

3.運行流程

1. 初始化SpringApplication

  1. 設置resourceload

  2. 設置primarySources,可以把啟動類加載進入spring容器

  3. 判斷當前application應該運行在什么環境下,即獲取webApplicationType(程序應用類型)

  4. 加載所有classpath下面的META-INF/spring.factories中的ApplicationContextInitializer

  5. 加載所有classpath下面的META-INF/spring.factories中的ApplicationListener

  6. mainApplicationClass:找出main方法啟動的class

2. 執行SpringApplication的run方法

1. 設置Java.awt.headless系統變量

2. 獲取監聽器SpringApplicationRunListeners

  1. 加載所有classpath下面的META-INF/spring.factories文件,獲取SpringApplicationRunListener的集合,即加載所有spring.factories文件中SpringApplicationRunListener

  2. 依次調用的SpringApplicationRunListener的starting方法,最終調用ApplicationListener的onApplicationEvent方法,發布springboot啟動事件

3. 實例化ApplicationArguments對象獲取應用參數

4. 創建并設置ConfigurableEnvironment (可配置環境)

    ConfigurableEnvironment:代表兩種意義:一種是profiles,用來描述哪些bean definitions是可用的;一種是properties,用來描述系統的配置,其來源可能是配置文件、JVM屬性文件、操作系統環境變量等等    

  1. 創建ConfigurableEnvironment,即執行getOrCreateEnvironment()方法,根據webApplicationType創建不同的Environment對象

  2. 配置environment,即執行configureEnvironment(XX)方法。主要把運行方法參數配置到environment

    1. 通過configurePropertySources(environment, args)設置properties

    2. 通過configureProfiles(environment, args)設置profiles

  3. 執行listeners.environmentPrepared(environment)方法,發布environmentPrepared事件,即調用ApplicationListener的onApplicationEvent事件   

  4. 執行bindToSpringApplication方法,即把當前的environment和當前的springApplication綁定

  5. 如果不是web環境,但是是web的environment,則把其轉換成標準的environment

  6. 執行ConfigurationPropertySources.attach(environment)方法,將ConfigurationPropertySource放入environment的propertysource中的第一個

5. 打印Banner

6. 創建spring的容器

  1. 根據不同的webApplicationType設置不同的contextClass(容器的class類型),然后生成不同的容器實例對象

  2. 生成容器實例的時候,對于Kotlin類使用'primary'構造函數實例化一個類,如果不是就使用默認構造函數,根據得到構造函數生成實例對象,如果構造函數不是公共的,我們嘗試去改變并訪問

7. 執行getSpringFactorInstances方法獲取具體實現類

8. 準備容器,在準備刷新容器前準備好容器

  1. 執行context.setEnvironment(environment)方法,設置spring容器的environment

  2. 執行postProcessApplicationContext(context)方法,設置beanNameGenerator(其不未空時注入到容器中)和resourceLoader(其不未空時加載對象)

  3. 執行applyInitializers(context),回調所有ApplicationContextInitializer的initialize來初始化context,其中還檢測各個ApplicationContextInitializer是否接受該類型的容器

  4. 執行listeners.contextPrepared(context),調用SpringApplicationRunListener的contextPrepared方法,但目前是個空實現。

  5. 依次向容器注冊springApplicationArguments和springBootBanner這兩個bean

  6. getAllSources就是獲取我們的primarySources和sources

  7. 加載所有資源到context里,即調用load(context, sources.toArray(new Object[0]))方法創建BeanDefinitionLoader,設置該loader的sources,annotatedReader,xmlReader,scanner,以及添加scanner的ExcludeFilter(即過濾springboot的啟動類),若用戶啟動的時候設置了beanNameGenerator,resourceLoader,environment的話就替代我們自身設置的屬性。同時根據source的類型選擇不同的load方法,這邊我們是load(class),最終判斷是否是component注解,是的話就通過annotatedReader將啟動類注冊成bean

  8. 執行listeners.contextLoaded(context)方法,判斷ApplicationListener是否屬于ApplicationContextAware,如果是的話就將spring容器賦值給該listener,然后將該ApplicationListener賦值給spring容器,然后調用ApplicationListener的onApplicationEvent方法

9. 執行refreshContext(context) 刷新spring容器

    1. refresh(context)
  1. 執行prepareRefresh()方法設置些初始的操作。比如 開啟激活,啟動日期,初始化propertySource。

  2. 獲取beanFactory

  3. 執行prepareBeanFactory(beanFactory),設置beanFactory的classloader,BeanExpressionResolver,PropertyEditorRegistrar,    ApplicationContextAwareProcessor和忽略xxxxAware,注冊依賴,還有ApplicationListenerDetector

    1. 自動注入不是指的@AutoWire 而是指的是beans的default-autowire="byType" 或在bean的autowire="byType" ,這樣spring 會去ioc容器尋找類型相似的類型給其注入,如果實現了spring 的xxaware接口,就不會自動注入記載filterPropertyDescriptorsForDependencyCheck刪除與入參類型相同的屬性

    2. ApplicationContextAwareProcessor:只是將applicationContext傳遞給ApplicationContextAwareProcessor,方便后面的xxxAware調用

    3. 忽略xxxxAware:忽略這些Aware接口實現類中與接口set方法中入參類型相同的屬性的的自動注入這樣就保證了關鍵的類是由spring容器自己產生的而不是我們注入的

    4. 注冊依賴:即指定一些類自動注入的實例是spring指定的實例對象

    5. ApplicationListenerDetector:檢測實現了ApplicationListener的實現類,因為有些實現類,無法通過getBeanNamesForType獲取到。

  4. 執行postProcessBeanFactory(beanFactory)方法,設置ignoreDependencyInterface(ServletContextAware)還有annotatedClasses,basePackages如果存在就設置。

  5. 執行invokeBeanFactoryPostProcessors(beanFactory)方法,從beanFactoryPostProcessors獲取BeanFactoryPostProcessor,然后先執行BeanDefinitionRegistryPostProcessor類型的postProcessBeanDefinitionRegistry,繼續從beanFactory獲取BeanDefinitionRegistryPostProcessor類型的bean然后執行postProcessBeanDefinitionRegistry,執行的過程按照PriorityOrdered,Ordered,普通的類型進行執行,然后優先執行registryProcessors的postProcessBeanFactory在執行regularPostProcessors的postProcessBeanFactory,再從BeanFactory獲取PriorityOrdered,Ordered,普通的類型三種類型的BeanFactoryPostProcessor,并按照順序執行。總結:從之前加入的beanFactoryPostProcessor先執行postProcessBeanDefinitionRegistry(假如是BeanDefinitionRegistryPostProcessor)然后在執行postProcessBeanFactory方法,然后從beanFactory獲取BeanFactoryPostProcessor 然后執行postProcessBeanFactory,執行過程中都要按照PriorityOrdered,Ordered,普通的類型三種類型的順序執行。

  6. 執行egisterBeanPostProcessors方法,從beanFactory獲取BeanPostProcessor分別按照PriorityOrdered,Ordered,普通的類型注冊BeanPostProcessor

    1. BeanPostProcessor和BeanFactoryPostProcessor:前者是對bean初始化前后進行設置,后者可以對beanFactory進行修改 或者,可以對beanDefinition進行修改或者增加或者初始化渴望提前初始化的bean

  7. 執行initMessageSource()方法,初始化我們國際化文件

  8. 執行initApplicationEventMulticaster()方法,設置applicationEventMulticaster,spring發布各種事件就依靠他,這個和springboot發布事件使用相同的類

  9. 執行onRefresh()方法,初始化其他的子容器類中的bean,同時創建spring的內置容器(tomcat)

  10. 執行registerListeners()方法,添加用戶設置applicationListeners,然后從beanFactory獲取ApplicationListener,然后發布需要earlyApplicationEvents事件

  11. 執行inishBeanFactoryInitialization(beanFactory)方法,實例化非懶加載的剩余bean

  12. 執行finishRefresh方法,清理資源緩存,初始化lifecycle,調用lifecycle的onrefresh,發布ContextRefreshedEvent的事件,激活JMX,啟動tomcat

  2. context.registerShutdownHook()

        注冊一個線程,該線程主要指向doclose方法,doClose方法的邏輯就是:從applicationContexts集合中刪除當前容器,MBeanServer卸載MBean,發布容器關閉事件,調用了實現了lifecycleProcessor接口的bean,destroyBeans,closeBeanFactory,onClose:關閉內置tomcat,active設置為false

10. 執行afterRefresh(context, applicationArguments)方法(目前是空的實現)

11. 執行listeners.started(context)方法,發布started事件

12. 執行callRunners(context, applicationArguments)方法

  從spring容器中獲取ApplicationRunner和CommandLineRunner對象,然后按照順序排序,循環調用他們的run方法

13. 執行handleRunFailure(context, ex, exceptionReporters, listeners)方法

     處理不同的異常狀態,然后調用listeners.failed(context, exception),并關閉spring容器

14. listeners.running(context)

    發布running事件

4. 自動化配置

    該配置模塊的主要使用到了SpringFactoriesLoader,即Spring工廠加載器,該對象提供了loadFactoryNames方法,入參為factoryClass和classLoader,即需要傳入上圖中的工廠類名稱和對應的類加載器,方法會根據指定的classLoader,加載該類加器搜索路徑下的指定文件,即spring.factories文件,傳入的工廠類為接口,而文件中對應的類則是接口的實現類,或最終作為實現類,所以文件中一般為一對多的類名集合,獲取到這些實現類的類名后,loadFactoryNames方法返回類名集合,方法調用方得到這些集合后,再通過反射獲取這些類的類對象、構造方法,最終生成實例

到此,關于“springboot2.0.6的運行流程以及怎么執行SpringApplication的run方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鄂伦春自治旗| 洪湖市| 锡林郭勒盟| 白城市| 安化县| 本溪市| 江华| 巩义市| 敦化市| 正定县| 韩城市| 蓬莱市| 永宁县| 安图县| 横峰县| 屏东县| 兴城市| 栖霞市| 金乡县| 云安县| 洛川县| 和平县| 会宁县| 交城县| 和林格尔县| 朝阳市| 商南县| 衡南县| 渝北区| 新乡县| 武安市| 通海县| 萍乡市| 平谷区| 石首市| 明星| 屏南县| 黎平县| 娄烦县| 南靖县| 丹巴县|