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