摘要:啟動原理和執行原理分析一的啟動原理我們打開,注意看下面兩個依賴我們第一步是繼承了父項目,然后在添加啟動器的依賴,項目就會自動給我們導入關于項目所需要的配置和。
上一篇我們看到,我們很輕松的完成了項目的構建,那么SpringBoot是如何做到的呢,在使用的使用又有哪些通用配置和注意事項呢?
其實SpringBoot給我們做了大量的自動配置功能,我們只需要引入對應的啟動器就可以直接使用,
作為SpringBoot的使用者,一定要對其原理有一個大致的了解,避免遇到問題時無法跟蹤。 接下來我們來分析分析。
我們打開POM.XML, 注意看下面兩個依賴:
org.springframework.boot spring-boot-starter-parent 2.1.1.RELEASE org.springframework.boot spring-boot-starter-web
我們第一步是繼承了父項目:spring-boot-starter-parent, 然后在添加 spring-boot-starter-web (WEB啟動器)的依賴,項目就會自動給我們導入關于WEB項目所需要的配置和JAR。如圖:
可能我們還有疑問,為什么一個mian方法就可以直接運行了,我們看看main方法類。
整個方法中, 就注解 @SpringBootApplication 和 SpringApplication 是我們不認識的,也比較臉生, 而且項目的啟動也是從這里運行的,那么我們就來看看他們是個啥,
我們先看直接,我們把鼠標移動到注解上面。
發現他是一個組合注解, 里面很有很注解,我們來對每個注解來分析一下:
前面 4 個是注解的元數據信息, 我們主要看后面 3 個注解:
@SpringBootConfiguration 點擊進去,我們發現使用的是 Spring 的 @Configuration
所以,到這里我們就可以知道,SpringBoot使用的是 @Configuration 的方式來配置IOC容器,@Configuration 就好比對應我們原來的一個XML配置文件(SpringBoot社區推薦使用基于JavaConfig的配置形式), 比如:
我們原來是這么寫:
.....省略
而現在可以用JavaConfig這么配置:
/** *@Description: 阿里連接池 *@Author:楊攀 *@Since:2019年1月6日下午5:18:02 */ @Configuration public class DruidDataSourceConfig { @Bean public DruidDataSource dataSource(){ DruidDataSource dataSource = new DruidDataSource(); //設置參數 //.....省略 return dataSource; }
在該類中標注了 @Bean 的方法返回的實例,都會注入到IOC容器中,而bean的id默認為方法名。(注意:@Configuration 是spring的注解,不是springboot的,本身spring提供了JavaConfig的配置)。
@EnableAutoConfiguration 注解,如果熟悉Spring框架的人都知道, Spring中也定義了很多@Enable開頭的注解, 比如: @EnableCaching等,如圖
他們都是通過@import來導入對應的配置類。 SpringBoot 也是一樣, @EnableAutoConfiguration點擊進入,也是通過@import來導入的。將所有符合自動配置條件的bean定義加載到IOC容器中
其中:
@AutoConfigurationPackage 自動配置包注解, 點擊進去后,我們可以看到源代碼:
其實這里就是把bean注冊到spring中, 我們可以斷點看看
上圖中,我們已經看到掃描到的包是 com.topinfo.yangp,就是我們main方法類的包及子包都會被掃描并注冊。
我們繼續更進,在添加后,發現txApplication已經注冊到Spring中了。
所以,我們在寫啟動類的時候,我們需要放在項目的頂級包中,以便SpringBoot進行掃描。
@Import(AutoConfigurationImportSelector.class) 導入注解,從名稱上來看,它導入了一個自動配置導入選擇器, 我們點擊進去
它實現了多個接口,并實現了一個 selectImports
然后我們點擊 100 行, 繼續跟進去
我們看 199 行, getCandidateConfigurations 根據獲取配置,點擊
會去讀取一個 spring.factories 的文件,讀取不到會表這個錯誤,我們繼續根據會看到,最終路徑的長這樣,而這個是spring提供的一個工具類。
它其實是去加載一個外部的文件,而這文件是在
我們打開這個文件,發現其有很多很多的自動配置類,包括SpringMVC,這就是為什么我們一開始就可以直接使用mvc的原因,如圖:
就這樣,@EnableAutoConfiguration就是從classpath中搜尋META-INF/spring.factories配置文件,并將其中org.springframework.boot.autoconfigure.EnableutoConfiguration對應的配置項通過反射(Java Refletion)實例化為對應的標注了@Configuration的JavaConfig形式的配置類,并加載到IOC容器中。
@ComponentScan 包掃描,就是根據定義的掃描路徑,把符合掃描規則的類裝配到spring容器中
這樣,關于 @SpringBootApplication 的注解的功能就分析差不多了, 簡單來說就是 3 個注解的組合注解,如:
@SpringBootApplication
|- @SpringBootConfiguration |- @Configuration //通過javaConfig的方式來添加組件到IOC容器中 |- @EnableAutoConfiguration |- @AutoConfigurationPackage //自動配置包,與@ComponentScan掃描到的添加到IOC |- @Import(AutoConfigurationImportSelector.class) //到META-INF/spring.factories中定義的bean添加到IOC容器中 |- @ComponentScan 包掃描
關于SpringBoot的啟動原理就差不多了。
二、SpringBoot 的執行原理就是,嗯,注解我們剛剛看過了,我們現在來看看為什么mian方法執行后,項目就直接啟動了,我們再來瞄一眼main方法:
直覺告訴我們,我們肯定從run方法入手,如圖:
方法中,先創建了一個SpringApplication的實例,然后調用實例的run方法,我們先看看new實例的時候做了什么,點擊進去查看,
點擊267行
我們可以看到,其實他主要做了幾個事情:
1、根據classpath里面是否存在某個特征類來判斷是否應該創建一個為Web應用使用的ApplicationContext類型
2、在應用的classpath中查找并加載所有可用的ApplicationContextInitializer
3、在應用的classpath中查找并加載所有可用的ApplicationListener
然后執行run方法。 我們看run方法,跟蹤后,我們可以看到run方法的內部實現。
到此,SpringBoot的啟動執行就差不多了,,后面我們在將下SpringBoot的常用配置
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72847.html
摘要:引入了新的環境和概要信息,是一種更揭秘與實戰六消息隊列篇掘金本文,講解如何集成,實現消息隊列。博客地址揭秘與實戰二數據緩存篇掘金本文,講解如何集成,實現緩存。 Spring Boot 揭秘與實戰(九) 應用監控篇 - HTTP 健康監控 - 掘金Health 信息是從 ApplicationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring...
摘要:作為面試官,我是如何甄別應聘者的包裝程度語言和等其他語言的對比分析和主從復制的原理詳解和持久化的原理是什么面試中經常被問到的持久化與恢復實現故障恢復自動化詳解哨兵技術查漏補缺最易錯過的技術要點大掃盲意外宕機不難解決,但你真的懂數據恢復嗎每秒 作為面試官,我是如何甄別應聘者的包裝程度Go語言和Java、python等其他語言的對比分析 Redis和MySQL Redis:主從復制的原理詳...
閱讀 3177·2019-08-30 15:55
閱讀 2950·2019-08-30 13:46
閱讀 1451·2019-08-29 17:29
閱讀 3520·2019-08-29 11:08
閱讀 3444·2019-08-29 11:04
閱讀 1091·2019-08-28 18:20
閱讀 551·2019-08-26 13:37
閱讀 1332·2019-08-26 11:49