一、簡述: 項目結構
二、簡述:啟動流程
說springboot的啟動流程,當然少不了springboot啟動入口類
1 @SpringBootApplication 2 public class SpringBootWebApplication { 3 public static void main(String[] args) { 4 SpringApplication application = new SpringApplication(SpringBootWebApplication.class); 5 application.run(args); 6 } 7 }
以上代碼很容易看出哪些是關鍵,當然是:
1、@SpringBootApplication
2、application.run()
分別是springboot 加載配置 和 啟動 ,下面詳細說明這兩塊。
1.SpringBootApplication的背后
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication { }
其中,三個是最重要的注解:
@SpringBootConfiguration (@SpringBootConfiguration中其實用的也是@Configuration);
@EnableAutoConfiguration ;
@ComponentScan
@SpringBootApplication整合了三個注解使用者寫起來看起來都比較簡潔。
1.1@Configuration
它就是JavaConfig形式的Spring Ioc容器的配置類使用的那個@Configuration,這里的啟動類標注了@Configuration之后,本身其實也是一個IoC容器的配置類。
如下案例說明xml和注解實現bean的定義
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" default-lazy-init="true"> <!--bean定義--> </beans>
1.2@EnableAutoConfiguration
@SuppressWarnings("deprecation") @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(EnableAutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration {
@EnableAutoConfiguration簡單的說它的作用就是借助@Import的支持,收集和注冊特定場景相關的bean定義。
其中,最關鍵的要屬@Import(EnableAutoConfigurationImportSelector.class),借助EnableAutoConfigurationImportSelector,
@EnableAutoConfiguration可以幫助SpringBoot應用將所有符合條件的@Configuration配置都加載到當前SpringBoot創建並使用的IoC容器。
借助於Spring框架原有的一個工具類:SpringFactoriesLoader的支持很智能的自動配置:
SpringFactoriesLoader其主要功能就是從指定的配置文件META-INF/spring.factories加載配置。
將其中org.springframework.boot.autoconfigure.EnableutoConfiguration對應的配置項通過反射(Java Refletion)實例化為對應的標注了@Configuration的JavaConfig形式的IoC容器配置類,然后匯總為一個並加載到IoC容器。(如下頁面模版的配置)
1.3springboot啟動簡單流程
1.3.1 當我們運行SpringApplication的main方法時,調用靜態方法run():
首先是實例化,SpringApplication初始化的時候主要做主要做三件事:
- 根據classpath下是否存在(ConfigurableWebApplicationContext)判斷是否要啟動一個web applicationContext。
- SpringFactoriesInstances加載classpath下所有可用的ApplicationContextInitializer
- SpringFactoriesInstances加載classpath下所有可用的ApplicationListener
1.3.2 SpringApplicatio實例化完成並且完成配置后調用run()方法,
首先遍歷初始化過程中加載的SpringApplicationRunListeners,
然后調用starting(),開始監聽springApplication的啟動。
1.3.3 加載SpringBoot配置環境(ConfigurableEnvironment),如果是通過web容器發布,會加載StandardEnvironment。
將配置環境(Environment)加入到監聽器對象中(SpringApplicationRunListeners)。
1.3.4 banner屬性的設置
1.3.5 ConfigurableApplicationContext(應用配置上下文)創建,根據webEnvironment是否是web環境創建默認的contextClass,
AnnotationConfigEmbeddedWebApplicationContext(通過掃描所有注解類來加載bean)和ConfigurableWebApplicationContext),
最后通過BeanUtils實例化上下文對象,並返回。
1.3.6 prepareContext()方法將listeners、environment、applicationArguments、banner等重要組件與上下文對象關聯。
1.3.7 refreshContext(context),bean的實例化完成IoC容器可用的最后一道工序。
1.3.8 最后springboot做一些收尾工作。
自此springboot的簡單流程到此結束。
結:
Spring Boot 是基於Spring的一套快速開發整合包,簡化了基於Spring的應用開發,只需要“run”就能創建一個獨立的、生產級別的Spring應用。
Spring Boot為Spring平台及第三方庫提供開箱即用的設置(提供默認設置),這樣我們就可以簡單的開始。多數SpringBoot應用只需要很少的Spring配置。