一些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
在 TypeExcludeFilter
和 AutoConfigurationExcludeFilter
里,帶來的最主觀的應該就是basepackage的scan了,像是為下個動作進行package的路徑。
這裡的邏輯很像Spring的設計風格,AOP,首先定義的切面,將絕對的package路徑下的class進行掃描,得到對應的切點,得到切點了後面該怎麼辦? 👇
Configuration
得到了切點了,當然是進行IOC啦,都拿到了class,不進行控制反轉還要幹什麼呢,運用java中的反射機制,將這些class進行實例化。
在 AutoConfigurationImportSelector
中,獲取到的class:
後續就在 ConfigurationClassPostProcessor
中 this.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。 😀