應用框架(Spring-boot 啓動過程與工做原理)

入口SpringApplication.run()

@SpringBootApplication
public class SpringBootStudyConfigApplication
    public static void main(String[] args) {
        SpringApplication.run(SpringBootStudyConfigApplication.class, args);
    }
}

認識@SpringBootApplication註解

是 @Configuration @EnableAutoConfiguration @ComponentScan 三個註解的複合java

請注意它的返回值:ConfigurableApplicationContextweb

SpringApplication 構造方法解讀

疑問:spring

一、ApplicationContextInitializer是作什麼用的? 請了解它的接口註釋、方法註釋、實現類有哪些。 二、 ApplicationListener是作什麼用的?編程

SpringApplication.run()實例方法解讀

環境準備過程解讀

疑問:api

一、參數配置在哪裏完成的加載?tomcat

在學習參數配置時學習到了一個很重要的類 ConfigFileApplicationListener 。瞭解到在它裏面完成的加載,它又是 在什麼時候被誰調用的呢?服務器

ConfigFileApplicationListener 的類定義mvc

它是一個EnvironmentPostProcessor,也是一個ApplicationListener,應該就是經過它們來完成的調用!app

    1)實現的EnvironmentPostProcessor方法,在這裏完成了加載配置文件的工做。webapp

 

    2) 實現的ApplicationListener方法

問: ApplicationEnvironmentPreparedEvent這個事件會在哪裏發佈?

想要看它的加載執行過程怎麼辦? 在加載的代碼處打個斷點就能夠看到完整的加載過程了!

ConfigurableApplicationContext 建立與準備過程解讀

1.ConfigurableApplicationContext 建立

createApplicationContext()

默認的三個常量類名是什麼?

2.準備過程

3.刷新過程

4.auto configuration的bean定義加載:

問題:一、META-INF/spring.factories中指定的auto configuration Bean定義在哪裏完成的加載? 整個過程的代碼已看完,沒看到這塊代碼,代碼茫茫,如何找到加載它們的代碼?

思考:必定會從META-INF/spring.factories中加載,加載的方法是哪一個? 前面的代碼中已見過從META-INF/spring.factories中加載其餘的:

那就從這個getSpringFactoriesInstances(...)方法調用中找到一個合適的點,打個斷點來看誰會加載自動配置

看到,它是調用的SpringFactoriesLoader.loadFactoryNames(type, classLoader));

在它上打個斷點,來看何時會加載自動配置的配置類:

獲得調用棧:

從調用棧看到是在進行ConfigurationClassPostProcessor處理階段

其實,祕密在@SpringBootApplication複合的 @EnableAutoConfiguration 註解

AutoConfigurationImportSelector 乾的這個事

重點說明:AutoConfigurationImportSelector 實現了 DeferredImportSelector

DeferredImportSelector 是延遲導入選擇器。所謂延遲:在全部指定的、包掃描到的@Configuration類中的 bean定義註冊後,纔會來處理延遲導入的@Configuration類

疑問:

一、這裏自動配置爲何要以DeferredImportSelector 延遲導入的方式? 答案:讓咱們本身編程配置的bean提早註冊,這樣自動配置時的條件判斷能發現到咱們配置的,就能作到再也不配置 自動配置的bean等。好比:若是咱們本身配置了數據源bean,則使用咱們配置的數據源,不在自動配置數據源。數 據源自動配置的代碼中能夠看到@ConditionalOnMissingBean({ DataSource.class, XADataSource.class }):

5.callRunners(context, applicationArguments) 解讀

在代碼中咱們看到,從applicationContext 獲取了全部 ApplicationRunner、CommandLineRunner類型的bean, 並執行了它們的run方法。

疑問

一、ApplicationRunner 是什麼?有什麼用?

二、CommandLineRunner是什麼?有什麼用? 兩個是一樣的用途:當ApplicationContext刷新好後,來執行你的應用邏輯。

示例:

除此以外,你還有什麼方式來執行應用邏輯嗎?

6.Tomcat是如何跑起來的?

從建立ApplicationContext處開始

看AnnotationConfigServletWebServerApplicationContext類

看它的父類ServletWebServerApplicationContext

WebServer的建立過程:

onRefresh()方法是AbstractApplicationContext中定義的供子類實現的空模板方法,在refresh()方法中被調用。

看它裏面的getWebServerFactory():從容器中找ServletWebServerFactory類型的Bean,只能有一個。

再看經過factory.getWebServer()獲得WebServer,先看接口定義:

在ServletWebServerApplicationContext中能夠看到作這個start動做的方法:

TomcatServletWebServerFactory中的實現:

疑問:TomcatServletWebServerFactory這個Bean哪裏配置的? 在spring boot 的自動配置中能夠找到

看 ServletWebServerFactoryAutoConfiguration

看ServletWebServerFactoryConfiguration.EmbeddedTomcat.class

看到 @EnableConfigurationProperties(ServerProperties.class)

能夠配置哪些服務器參數:

再來看下tomcat能夠配置什麼參數

參數配置示例: application.yml

7.spring boot web 中集成 Servlet api

一、使用 Servlet Filter 有兩種方式

方式一 servelt3.0 註解 + @ServletComponentScan

方式二:ServletRegistrationBean和FilterRegistrationBean註冊方式

二、jsp作視圖技術

spring boot 不推薦使用jsp。
集成jsp的步驟:
一、引入對應的jar

二、建立jsp文件放置目錄 src/main下建立 webapp/WEB-INF/jsp/

 

三、在application.yml中配置spring.mvc.view

四、編寫Controller jsp

五、運行、測試

相關文章
相關標籤/搜索