1. 程式人生 > >SpringBoot 啟動過程

SpringBoot 啟動過程

SpringBoot 啟動過程

 

@SpringBootApplication

SpringApplication.run(SpringbootlearnApplication.class, args); 

 

 

主啟動類, 一個SpringBootApplication 一個SpringApplication

 

發現SpringBootApplication可以拆分為三個annotation

@Configuration
@EnableAutoConfiguration
@ComponentScan

 

分別解釋:

1@Configuration

相當於JavaConfig格式的xml註解 ,可以看下列例子

一個javaBean一個xml形式

2@ComponentScan

@ComponentScan這個註解在Spring中很重要,它對應XML配置中的元素,@ComponentScan的功能其實就是自動掃描並載入符合條件的元件(比如@Component@Repository等)或者bean定義,最終將這些bean定義載入到IoC容器中。

我們可以通過basePackages等屬性來細粒度的定製@ComponentScan自動掃描的範圍,如果不指定,則預設

Spring框架實現會從宣告@ComponentScan所在類的package進行掃描。

注:所以SpringBoot的啟動類最好是放在root package下,因為預設不指定basePackages

3@EnableAutoConfiguration

算是最重要的一個ANNOTATION了

 

@EnableAutoConfiguration的理念和做事方式其實一脈相承,簡單概括一下就是,藉助@Import的支援,收集和註冊特定場景相關的bean定義

 

開啟 @EnableAutoCOnfiguration

最終要的是 Import

@Import(EnableAutoConfigurationImportSelector.class),藉助EnableAutoConfigurationImportSelector@EnableAutoConfiguration可以幫助SpringBoot應用將所有符合條件的@Configuration配置都載入到當前SpringBoot建立並使用的IoC容器。就像一隻"八爪魚"一樣

1 如果我們使用的是SpringApplication的靜態run方法,那麼,這個方法裡面首先要建立一個SpringApplication物件例項,然後呼叫這個建立好的SpringApplication的例項方法。在SpringApplication例項初始化的時候,它會提前做幾件事情:

  • 根據classpath裡面是否存在某個特徵類(org.springframework.web.context.ConfigurableWebApplicationContext)來決定是否應該建立一個為Web應用使用的ApplicationContext型別。
  • 使用SpringFactoriesLoader在應用的classpath中查詢並載入所有可用的ApplicationContextInitializer
  • 使用SpringFactoriesLoader在應用的classpath中查詢並載入所有可用的ApplicationListener
  • 推斷並設定main方法的定義類。

2 SpringApplication例項初始化完成並且完成設定後,就開始執行run方法的邏輯了,方法執行伊始,首先遍歷執行所有通過SpringFactoriesLoader可以查詢到並載入的SpringApplicationRunListener。呼叫它們的started()方法,告訴這些SpringApplicationRunListener"嘿,SpringBoot應用要開始執行咯!"

3 建立並配置當前Spring Boot應用將要使用的Environment(包括配置要使用的PropertySource以及Profile)。

4 遍歷呼叫所有SpringApplicationRunListenerenvironmentPrepared()的方法,告訴他們:"當前SpringBoot應用使用的Environment準備好了咯!"

5 如果SpringApplicationshowBanner屬性被設定為true,則列印banner

6 根據使用者是否明確設定了applicationContextClass型別以及初始化階段的推斷結果,決定該為當前SpringBoot應用建立什麼型別的ApplicationContext並建立完成,然後根據條件決定是否新增ShutdownHook,決定是否使用自定義的BeanNameGenerator,決定是否使用自定義的ResourceLoader,當然,最重要的,將之前準備好的Environment設定給建立好的ApplicationContext使用。

7 ApplicationContext建立好之後,SpringApplication會再次藉助Spring-FactoriesLoader,查詢並載入classpath中所有可用的ApplicationContext-Initializer,然後遍歷呼叫這些ApplicationContextInitializerinitializeapplicationContext)方法來對已經建立好的ApplicationContext進行進一步的處理。

8 遍歷呼叫所有SpringApplicationRunListenercontextPrepared()方法。

9 最核心的一步,將之前通過@EnableAutoConfiguration獲取的所有配置以及其他形式的IoC容器配置載入到已經準備完畢的ApplicationContext

10 遍歷呼叫所有SpringApplicationRunListenercontextLoaded()方法。

11 呼叫ApplicationContextrefresh()方法,完成IoC容器可用的最後一道工序。

12 查詢當前ApplicationContext中是否註冊有CommandLineRunner,如果有,則遍歷執行它們。

13 正常情況下,遍歷執行SpringApplicationRunListenerfinished()方法、(如果整個過程出現異常,則依然呼叫所有SpringApplicationRunListenerfinished()方法,只不過這種情況下會將異常資訊一併傳入處理)

 

Thymeleaf模板引擎

Thymeleaf是一款用於渲染XML/XHTML/HTML5內容的模板引擎。類似JSPVelocityFreeMaker等,它也可以輕易的與Spring MVCWeb框架進行整合作為Web應用的模板引擎。與其它模板引擎相比,Thymeleaf最大的特點是能夠直接在瀏覽器中開啟並正確顯示模板頁面,而不需要啟動整個Web應用。它的功能特性如下:

  • Spring MVC@Controller中的方法可以直接返回模板名稱,接下來Thymeleaf模板引擎會自動進行渲染
  • 模板中的表示式支援Spring表示式語言(Spring EL)
  • 表單支援,併兼容Spring MVC的資料繫結與驗證機制
  • 國際化支援

Spring官方也推薦使用Thymeleaf,所以本篇程式碼整合就使用Thymeleaf來整合。

 

 

瀏覽器輸入http://localhost:8989/learn/test

 

  1. templates 裡面的 controller可以自動跳轉
  2. webapp裡也可以

 

 

對於JSP渲染

依賴的jar包