1. 程式人生 > >這一次搞懂SpringBoot核心原理(自動配置、事件驅動、Condition)

這一次搞懂SpringBoot核心原理(自動配置、事件驅動、Condition)

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