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 啓動流程就先講這麼多,本人閱讀源碼能力有限!,歡迎大佬指正!