三.spring-boot:簡述springboot啓動流程

正文

說springboot的啓動流程固然少不了springboot啓動入口類java

@SpringBootApplication
public class SpringBootWebApplication {
    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(SpringBootWebApplication.class);
        application.run(args);
    }
}

以上代碼很容易看出哪些是關鍵,固然是@SpringBootApplication和application.run()分別是springboot加載配置和啓動,下面詳細說明這兩塊。web


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 {
}

其中@Configuration(@SpringBootConfiguration中其實用的也是@Configuration);@EnableAutoConfiguration;@ComponentScan三個是最重要的註解,@SpringBootApplication整合了三個註解使用者寫起來看起來都比較簡潔。spring

1.1@Configuration

它就是JavaConfig形式的Spring Ioc容器的配置類使用的那個@Configuration,這裏的啓動類標註了@Configuration以後,自己其實也是一個IoC容器的配置類。以下案例說明xml和註解實現bean的定義springboot

<?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的支持很智能的自動配置:app

clipboard.png

SpringFactoriesLoader其主要功能就是從指定的配置文件META-INF/spring.factories加載配置。將其中org.springframework.boot.autoconfigure.EnableutoConfiguration對應的配置項經過反射(Java Refletion)實例化爲對應的標註了@Configuration的JavaConfig形式的IoC容器配置類,而後彙總爲一個並加載到IoC容器。(以下頁面模版的配置)框架

clipboard.png


1.3springboot啓動簡單流程

1.3.1 當咱們運行SpringApplication的main方法時,調用靜態方法run()首先是實例化,SpringApplication初始化的時候主要作主要作三件事:工具

  • 根據classpath下是否存在(ConfigurableWebApplicationContext)判斷是否要啓動一個web applicationContext。
  • SpringFactoriesInstances加載classpath下全部可用的ApplicationContextInitializer
  • SpringFactoriesInstances加載classpath下全部可用的ApplicationListener

clipboard.png

1.3.2 SpringApplicatio實例化完成而且完成配置後調用run()方法,首先遍歷初始化過程當中加載的SpringApplicationRunListeners,而後調用starting(),開始監聽springApplication的啓動。spa

clipboard.png

1.3.3 加載SpringBoot配置環境(ConfigurableEnvironment),若是是經過web容器發佈,會加載StandardEnvironment。將配置環境(Environment)加入到監聽器對象中(SpringApplicationRunListeners)。code

1.3.4 banner屬性的設置xml

clipboard.png

1.3.5 ConfigurableApplicationContext(應用配置上下文)建立,根據webEnvironment是不是web環境建立默認的contextClass
,AnnotationConfigEmbeddedWebApplicationContext(經過掃描全部註解類來加載bean)和ConfigurableWebApplicationContext),最後經過BeanUtils實例化上下文對象,並返回。

clipboard.png

1.3.6 prepareContext()方法將listeners、environment、applicationArguments、banner等重要組件與上下文對象關聯。

clipboard.png

1.3.7 refreshContext(context),bean的實例化完成IoC容器可用的最後一道工序。

clipboard.png

1.3.8 最後springboot作一些收尾工做。自此springboot的簡單流程到此結束。

相關文章
相關標籤/搜索