Spring Boot程序有一個入口,就是main方法。main里面調用SpringApplication.run()啟動整個Spring Boot程序,該方法所在類需要使用@SpringBootApplication復合注解。
其中需要關注的是:
@SpringBootApplication注解其實是包含了三個注解:
(1)@EnableAutoConfiguration:SpringBoot根據應用所聲明的依賴來對Spring框架進行自動配置。簡單概括一下就是,是借助@Import的幫助,將所有符合自動配置條件的bean定義加載到IoC容器。
(2)@Configuration:它就是JavaConfig形式的Spring Ioc容器的配置類。被標注的類等於在spring的XML配置文件中(applicationContext.xml),裝配所有bean事務,提供了一個spring的上下文環境。
(3)@ComponentScan:組件掃描,可自動發現和裝配Bean,功能其實就是自動掃描並加載符合條件的組件或者bean定義,最終將這些bean定義加載到IoC容器中。
二:詳細解釋:
1、SpringBoot啟動的時候,會構造一個SpringApplication的實例,然后調用這個實例的run方法,在run方法調用之前,也就是構造SpringApplication的時候會進行初始化的工作,初始化的時候會做以下幾件事:
(1)把參數sources設置到SpringApplication屬性中,這個sources可以是任何類型的參數.
(2)判斷是否是web程序,並設置到webEnvironment的boolean屬性中.
(3)創建並初始化ApplicationInitializer,設置到initializers屬性中 。
(4)創建並初始化ApplicationListener,設置到listeners屬性中 。
(5)初始化主類mainApplicatioClass。
源代碼:
private void initialize(Object[] sources) { if (sources != null && sources.length > 0) { //把sources設置到SpringApplication的sources屬性中,目前只是一個MyApplication類對象 this.sources.addAll(Arrays.asList(sources)); } //判斷是否是web程序,並設置到webEnvironment的boolean屬性中 this.webEnvironment = deduceWebEnvironment(); //找出所有的初始化器,默認有5個,設置到initializers屬性中 。 setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class)); //找出所有的應用程序監聽器,默認有9個,設置到listeners屬性中 。 setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); //找出運行的主類(main class) this.mainApplicationClass = deduceMainApplicationClass(); }
2、SpringApplication構造完成之后調用run方法,啟動SpringApplication,run方法執行的時候會做以下幾件事:
(1)構造一個StopWatch計時器,觀察SpringApplication的執行 。
(2)獲取SpringApplicationRunListeners並封裝到SpringApplicationRunListeners中啟動,用於監聽run方法的執行。
(3)創建並初始化ApplicationArguments,獲取run方法傳遞的args參數。
(4)創建並初始化ConfigurableEnvironment(環境配置)。
(5)打印banner(只用在Classpath下添加字符文件圖標,就可以在啟動時候打印)。
(3)構造Spring容器(ApplicationContext)上下文。
(4)SpringApplicationRunListeners發布finish事件。
(5)StopWatch計時器停止計時。
如果想要深入看詳細的步驟,建議去網上搜索,很多作者都寫了細節的部分。
可以參考我認為寫的不錯的兩篇文章: