一些SpringBoot的初步理解

SpringBoot

在這裏插入圖片描述

SpringBoot作爲近幾年很火的微服務框架,只需要簡單的幾個依賴,少量的配置,就可以使用它快速搭建一個輕量級的微服務,優點是簡單、快速、大道至簡,缺點是真的太單一,不適於項目中的模塊開發。

如果是單一的應用,比如做接口轉發、項目啓動,SpringBoot很合適這些場景,如果是項目開發,建議還是使用SpringCloud

下面整理了一些理解SpringBoot和使用SpringBoot的內容,Spring官方說明請點擊SpringBoot Starter

理解SpringBoot

基本註解

  • SpringBootApplication

加載類

  • TypeExcludeFilter
  • AutoConfigurationExcludeFilter
  • EnableAutoConfiguration
  • AutoConfigurationImportSelector

Web服務

  • WebServer

加載順序,淡黃色爲註解,淡綠色爲類。

在這裏插入圖片描述

按照圖上的順序,並且跟隨SpringBoot的源碼來進行斷點跟蹤,其實不難發現,SpringBoot加載順序的邏輯意義:

   @SpringBootApplication
   public class Application {
   
       public static void main(String[] args) {
           SpringApplication.run(Application.class, args);
       }
   
   }

SpringBootApplication

在啓動類上標記的 SpringBootApplication 註解,表明這是一個SpringBoot項目, 而 SpringApplication.run(Application.class, args);,作爲SpringBoot的啓動,也進入到圖上的Initializer流程中;

Initializer

在Initializer中,主要的也就是 SpringApplication 類中,初始化加載了一些參數:

   public SpringApplication(ResourceLoader resourceLoader, Class... primarySources) {
           this.sources = new LinkedHashSet();
           this.bannerMode = Mode.CONSOLE;
           this.logStartupInfo = true;
           this.addCommandLineProperties = true;
           this.headless = true;
           this.registerShutdownHook = true;
           this.additionalProfiles = new HashSet();
           this.isCustomEnvironment = false;
           this.resourceLoader = resourceLoader;
           Assert.notNull(primarySources, "PrimarySources must not be null");
           this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));
           this.webApplicationType = WebApplicationType.deduceFromClasspath();
           this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
           this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
           this.mainApplicationClass = this.deduceMainApplicationClass();
       }
       

大概在類中的第92行左右,初始化了log,initializer,listener,包括resources下的配置文件:application.yaml;

Scan

TypeExcludeFilterAutoConfigurationExcludeFilter 裏,帶來的最主觀的應該就是basepackage的scan了,像是爲下個動作進行package的路徑。

這裏的邏輯很像Spring的設計風格,AOP,首先定義的切面,將絕對的package路徑下的class進行掃描,得到對應的切點,得到切點了後面該怎麼辦? 👇

Configuration

得到了切點了,當然是進行IOC啦,都拿到了class,不進行控制反轉還要幹什麼呢,運用java中的反射機制,將這些class進行實例化。

AutoConfigurationImportSelector 中,獲取到的class:

在這裏插入圖片描述

後續就在 ConfigurationClassPostProcessorthis.reader.loadBeanDefinitions(configClasses); 進行實例化;

Web

Web,主要是SpringBoot中Restful所需要的容器,Web可以提供對外的Http請求。SpringBoot默認的WebServer是Tomcat,可以自己在項目的配置文件中更換成jetty或者netty。

具體源碼可以看看 TomcatWebServer

使用SpringBoot

構建SpringBoot應用超級簡單,可以在Spring Initializer中創建,將創建後的zip文件download到本地。

或者直接在idea中 new project,選擇Spring Initializer。

SpringBoot發佈的服務可以使用 Resttemplate 來進行調用,對於SpringBoot來說很方便,但是如果要傳輸的參數較多,還是建議看看SpringCloud。 😀

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