Spring Boot 啓動流程篇

Spring Boot 啓動原理

前言:

Spring Boot 優勢

SpringBoot所具備的特徵有:

  • 可以創建獨立的Spring應用程序,並且基於其Maven或Gradle插件,可以創建可執行的JARs和WARs;
  • 內嵌Tomcat或Jetty等Servlet容器;
  • 提供自動配置的“starter”項目對象模型(POMS)以簡化Maven配置;
  • 儘可能自動配置Spring容器;
  • 提供準備好的特性,如指標、健康檢查和外部化配置;
  • 絕對沒有代碼生成,不需要XML配置。
  • 簡化部署,因爲 Spring Boot 內嵌了 tomcat,我們只需要將項目打成 jar 包,使用 java -jar xxx.jar一鍵式啓動項目,環境中有jdk即可.

1.1 Spring Boot pom文件

      1.1.1 父項目

   <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    他的父項目是:
    <parent>
	    <groupId>org.springframework.boot</groupId>
	    <artifactId>spring-boot-dependencies</artifactId>
	    <version>2.2.4.RELEASE</version>
	    <relativePath>../../spring-boot-dependencies</relativePath>
 	 </parent>
 	 他來管理Spring Boot應用中的所有依賴版本

Spring Boot的版本仲裁中心;

以後我們導入依賴默認是不需要寫版本;(沒有在dependencies裏面管理的依賴自然需要聲明版本號)

      1.1.2啓動器

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

spring-boot-starter-web :
           pring-boot-starter:spring-boot場景啓動器;幫我們導入了web模塊正常運行所依賴的組件;

Spring Boot將所有的功能場景都抽取出來,做成一個個的starters(啓動器),只需要在項目裏面引入這些starter相關場景的所有依賴都會導入進來。要用什麼功能就導入什麼場景的啓動器
在這裏插入圖片描述
可以看到spring-boot-starter-web 中繼承了 Spring,MVC,tomcat…等等一些web使用到的maven座標,這也就是Spring Boot中集成了tomcat ,無需手動去配置tomcat;

2.1 主程序,主入口類


/**
 * SpringBootApplicationc此註解標註一個主程序類,這也就說明是一個Spring Boot應用
 */
@SpringBootApplication
public class HelloworldApplication {

    public static void main(String[] args) {

        SpringApplication.run(HelloworldApplication.class, args);
    }

}

2.2 @SpringBootApplication

應用標註在某個類上說明這個類是SpringBoot的主配置類,SpringBoot就應該運行這個類型的main方法來啓動SpringBoot應用;

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

2.2.1 @**SpringBootConfiguration

Spring Boot的配置類;
標註在某個類上,表示這是一個Spring Boot的配置類;

​        @Configuration:配置類上來標註這個註解;

​ 配置類 ----- 配置文件;配置類也是容器中的一個組件;@Component

2.2.2 @EnableAutoConfiguration

開啓自動配置功能:
        以前我們需要配置的東西,SpringBoot幫助我們自動配置**@EnableAutoConfiguration**告訴SpringBoot開啓自動配置功能;這樣自動配置才能生效;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

 @AutoConfigurationPackage:自動配置包

​ @Import(AutoConfigurationPackages.Registrar.class):

​ Spring的底層註解@Import,給容器中導入一個組件;導入的組件由AutoConfigurationPackages.Registrar.class;

將主配置類(@SpringBootApplication標註的類)的所在包及下面所有子包裏面的所有組件掃描到Spring容器;

​ @Import(EnableAutoConfigurationImportSelector.class);

​ 給容器中導入組件?

EnableAutoConfigurationImportSelector:導入哪些組件的選擇器;

​ 將所有需要導入的組件以全類名的方式返回;這些組件就會被添加到容器中;

​ 會給容器中導入非常多的自動配置類(xxxAutoConfiguration);就是給容器中導入這個場景需要的所有組件,並配置好這些組件;
在這裏插入圖片描述
selectImports : 查找需要導入的依賴名稱
AutoConfigurationImportSelector : 自動導入所需要的的依賴
    閱讀源碼: 首先找到所有boot中集成的依賴,然後根據自行引入的maven依賴排除掉工程中沒有依賴的maven座標…

有了自動配置類,免去了我們手動編寫配置注入功能組件等的工作;

​ SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader);

==Spring Boot在啓動的時候從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值作爲自動配置類導入到容器中,自動配置類就生效,幫我們進行自動配置工作;==以前我們需要自己配置的東西,自動配置類都幫我們;

J2EE的整體整合解決方案和自動配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar;

Spring Boot 啓動流程就先講這麼多,本人閱讀源碼能力有限!,歡迎大佬指正!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章