SpringBoot -- 項目結構+啟動流程


一、簡述: 項目結構

 

 

 

二、簡述:啟動流程

 

 

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

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的啟動。

clipboard.png

1.3.3 加載SpringBoot配置環境(ConfigurableEnvironment),如果是通過web容器發布,會加載StandardEnvironment。

         將配置環境(Environment)加入到監聽器對象中(SpringApplicationRunListeners)。

1.3.4 banner屬性的設置

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的簡單流程到此結束。

結:

Spring Boot 是基於Spring的一套快速開發整合包,簡化了基於Spring的應用開發,只需要“run”就能創建一個獨立的、生產級別的Spring應用。

Spring Boot為Spring平台及第三方庫提供開箱即用的設置(提供默認設置),這樣我們就可以簡單的開始。多數SpringBoot應用只需要很少的Spring配置。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM