這一次搞懂SpringBoot核心原理(自動配置、事件驅動、Condition)
阿新 • • 發佈:2020-06-26
@[TOC]
# 前言
SpringBoot是Spring的包裝,通過自動配置使得SpringBoot可以做到開箱即用,上手成本非常低,但是學習其實現原理的成本大大增加,需要先了解熟悉Spring原理。如果還不清楚Spring原理的,可以先檢視博主之前的文章,本篇主要分析SpringBoot的啟動、自動配置、Condition、事件驅動原理。
# 正文
## 啟動原理
SpringBoot啟動非常簡單,因其內建了Tomcat,所以只需要通過下面幾種方式啟動即可:
```java
@SpringBootApplication(scanBasePackages = {"cn.dark"})
public class SpringbootDemo {
public static void main(String[] args) {
// 第一種
SpringApplication.run(SpringbootDemo .class, args);
// 第二種
new SpringApplicationBuilder(SpringbootDemo .class)).run(args);
// 第三種
SpringApplication springApplication = new SpringApplication(SpringbootDemo.class);
springApplication.run();
}
}
```
可以看到第一種是最簡單的,也是最常用的方式,需要注意類上面需要標註@SpringBootApplication註解,這是自動配置的核心實現,稍後分析,先來看看SpringBoot啟動做了些什麼?
在往下之前,不妨先猜測一下,run方法中需要做什麼?對比Spring原始碼,我們知道,Spring的啟動都會建立一個**ApplicationContext**的應用上下文物件,並呼叫其**refresh**方法啟動容器,SpringBoot只是Spring的一層殼,肯定也避免不了這樣的操作。另一方面,以前通過Spring搭建的專案,都需要打成War包釋出到Tomcat才行,而現在SpringBoot已經內建了Tomcat,只需要打成Jar包啟動即可,所以在**run**方法中肯定也會建立對應的Tomcat物件並啟動。以上只是我們的猜想,下面就來驗證,進入run方法:
```java
public ConfigurableApplicationContext run(String... args) {
// 統計時間用的工具類
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
Co