1. 程式人生 > >SpringBoot啟動分析

SpringBoot啟動分析

springboot 啟動分析

通常我們都是在main方法中調用SpringApplication.run()方法啟動SpringBoot應用的,

今天來看一下啟動過程中都幹了些什麽。上圖。

技術分享

技術分享

技術分享

技術分享

大致分為兩步,第一步new一個SpringApplication對象,第二步調用其run方法。

在創建SpringApplication對象的時候做了以下幾件事情:

(1)判斷應用是不是Web應用,判斷的依據是classpath中有沒有Servlet和ConfigurableWebApplicationContext,具體來講就是,能不能成功獲取到它們的Class對象

(2)設置Initializer和Listener

(3)判斷main方法

這裏有必要了解一下ApplicationContextInitializer和ApplicationListener是幹什麽的

技術分享

首先,ApplicationContextInitializer它是初始化Spring ConfigurableApplicationContext的時候的回調接口,它會先於ConfigurableApplicationContext的refresh()方法被調用。而我們知道ConfigurableApplicationContext的refresh()方法是在AbstractApplicationContext中實現的。

技術分享

ApplicationListener是一個基於標準的EventListener的事件監聽器,用的是觀察者模式。

這兩步都有一個共同點就是都調用getSpringFactoriesInstances()方法,下面看下:

技術分享

技術分享

技術分享

它的作用就是從classpath中所有的META-INF/spring.factories文件中找到指定Key的值。(註意:是所有的META-INF/spring.factories

然後將其以List形式返回,並實例化它們。

在我們的例子中,這兩次找的key值分別是:org.springframework.context.ApplicationContextInitializer和org.springframework.context.ApplicationListener

我們具體看一下它們的值是什麽

技術分享

技術分享


總之呢,我們可以知道在容器啟動的過程中,ApplicationContextInitializer的initialize()方法在AbstractApplicationContext的refresh()方法之前被調用。

到此為止,SpringApplication對象已經創建好了,接下來調用其run()方法。


這裏先來了解一下SpringApplicationRunListener,它是SpringApplication#run()方法的一個監聽器,並沒有什麽實質性的作用。

技術分享技術分享接下來在看run方法的時候,我們將忽略SpringApplicationRunListener這個監聽器。

技術分享


第1步、創建一個ApplicationArguments對象,它是對我們運行時傳進來的參數的一個封裝

第2步、創建並配置Environment。這裏,如果是web環境,則創建StandardServletEnvironment,否則創建一個StandardEnvironment

技術分享

技術分享

第3步、打印Banner

第4步、初始化ApplicationContext。這裏,如果是web環境,則實例化AnnotationConfigEmbeddedWebApplicationContext,否則實例化AnnotationConfigApplicationContext。

技術分享

技術分享

第5步、創建FailureAnalyzers對象

第6步、準備上下文

(1)如果BeanNameGenerator不為空,將其註冊到BeanFactory。(PS:其實就是ApplicationContext)

(2)調用所有ApplicationContextInitializer的initialize()方法

(3)將ApplicationArguments和Banner的實例註冊到Context

(4)加載Sources

技術分享

技術分享

技術分享


到這裏,sources中所有的Bean都被加載到Context中了

第7步、刷新Context。這裏它直接調用的AbstractApplicationContext的refresh()方法,前面的文章已經介紹過了,這裏不再贅述。

技術分享

技術分享


第8步、調用Context中所有的ApplicationRunner和CommandLineRunner

技術分享

到此為止,啟動完成!!!

總結:

第1步、所有的源對象(source)保存到Set<Object> sources成員變量中

第2步、判斷是否web環境

第3步、設置Initializer和Listener

第4步、判斷main方法

第5步、創建ApplicationArguments對象

第6步、創建並配置環境

第7步、創建Banner

第8步、創建ApplicationContext

第9步、配置ApplicationContext。在這一步中會回調所有的ApplicationContextInitializer,還會註冊一些特殊的Bean到Context,最重要的是會加載sources中所配置的所有的Bean到Context中。

第10步、刷新Context。這裏直接調用AbstractApplicationContext的refresh()方法。

第11步、調用容器中所有的ApplicationRunner和CommandLineRunner



本文出自 “十裏稻花香” 博客,請務必保留此出處http://5880861.blog.51cto.com/5870861/1970708

SpringBoot啟動分析