【筆記】第一階段 模塊四:SpringBoot原理以及源碼剖析

1.源碼剖析-依賴管理

(1)為什么導(dǎo)入dependency時不需要指定版本懒震?
在Spring Boot入門程序中罩息,項目pom.xml文件有兩個核心依賴,分別是spring-boot-starter?parent和spring-boot-starter-web个扰,關(guān)于這兩個依賴的相關(guān)介紹具體如下:
1.1.spring-boot-starter-parent依賴
pom.xml文件中找到spring-boot-starter-parent依賴瓷炮,示例代碼如下:

<!-- Spring Boot父項目依賴管理 --> 
<parent> 
<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-starter-parent<11./artifactId>
 <version>2.2.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> 
</parent>

將spring-boot-starter-parent依賴作為Spring Boot項目的統(tǒng)一父項目依賴管理,并將項目版本號統(tǒng)一為2.2.2.RELEASE递宅,該版本號根據(jù)實際開發(fā)需求是可以修改的.
?? 看spring-boot-starter-parent底層源文件娘香,發(fā)現(xiàn)spring-boot?starter-parent的底層有一個父依賴spring-boot-dependencies,核心代碼具體如下:

<parent> 
<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-dependencies</artifactId>
 <version>2.2.2.RELEASE</version> 
<relativePath>../../spring-boot-dependencies</relativePath> 
</parent>

而看spring-boot-dependencies底層源文件办龄,核心代碼具體如下:

<properties>
 <activemq.version>5.15.11</activemq.version> 
...
 <solr.version>8.2.0</solr.version> 
 <mysql.version>8.0.18</mysql.version>
 <kafka.version>2.3.1</kafka.version>
 <spring-amqp.version>2.2.2.RELEASE</spring-amqp.version> 
 <spring-restdocs.version>2.0.4.RELEASE</spring-restdocs.version>
 <spring-retry.version>1.2.4.RELEASE</spring-retry.version>
 <spring-security.version>5.2.1.RELEASE</spring-security.version> 
 <spring-session-bom.version>Corn-RELEASE</spring-session-bom.version> 
 <spring-ws.version>3.0.8.RELEASE</spring-ws.version> 
 <sqlite-jdbc.version>3.28.0</sqlite-jdbc.version> 
 <sun-mail.version>${jakarta-mail.version}</sun-mail.version> 
 <tomcat.version>9.0.29</tomcat.version> 
 <thymeleaf.version>3.0.11.RELEASE</thymeleaf.version> 
 <thymeleaf-extras-data-attribute.version>2.0.1</thymeleaf-extras-data- attribute.version>
 ... 
</properties>

該文件通過標(biāo)簽對一些常用技術(shù)框架的依賴文件進(jìn)行了統(tǒng)一版本號管理烘绽,都有與Spring Boot 2.2.2版本相匹配的版本,這也是pom.xml引入依賴文件不需要標(biāo)注依賴文件版本號的原因俐填。
??如果pom.xml引入的依賴文件不是 spring-boot-starter-parent管理的安接,那么在
pom.xml引入依賴文件時,需要使用標(biāo)簽指定依賴文件的版本號英融。

(2) spring-boot-starter-parent父依賴啟動器的主要作用是進(jìn)行版本統(tǒng)一管理盏檐,那么項目運
行依賴的JAR包是從何而來的?
1.2 spring-boot-starter-web依賴
源碼如下

<dependencies> 
  <dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter</artifactId> 
    <version>2.2.2.RELEASE</version> 
    <scope>compile</scope> 
  </dependency> 
  <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-json</artifactId> 
    <version>2.2.2.RELEASE</version>
    <scope>compile</scope> 
  </dependency> 
  <dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-tomcat</artifactId> 
    <version>2.2.2.RELEASE</version> <scope>compile</scope> 
  </dependency> 
  <dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-validation</artifactId> 
    <version>2.2.2.RELEASE</version> 
    <scope>compile</scope> 
    <exclusions> 
      <exclusion> 
        <artifactId>tomcat-embed-el</artifactId>
         <groupId>org.apache.tomcat.embed</groupId>
      </exclusion> 
    </exclusions>
  </dependency> 
  <dependency> 
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId> 
    <version>5.2.2.RELEASE</version> 
    <scope>compile</scope>
   </dependency> 
  <dependency> 
    <groupId>org.springframework</groupId>
     <artifactId>spring-webmvc</artifactId>
     <version>5.2.2.RELEASE</version> 
    <scope>compile</scope> 
  </dependency> 
</dependencies>

*spring-boot-starter-web依賴啟動器的主要作用是提供Web開發(fā)場景所需的底層所有依賴;
*Spring Boot除了提供有上述介紹的Web依賴啟動器外驶悟,還提供了其他許多開發(fā)場景的相關(guān)依賴

2. 自動配置(啟動流程)

總結(jié)
因此springboot底層實現(xiàn)自動配置的步驟是:
(1). springboot應(yīng)用啟動糯笙;
??啟動入口是@SpringBootApplication注解標(biāo)注類中的main()方法, @SpringBootApplication能夠掃描Spring組件并自動配置Spring Boot
(2). @SpringBootApplication起作用撩银;
@SpringBootApplication注解是一個組合注解,前面 4 個是注解的元數(shù)據(jù)信息豺憔, 我們主要看后面 3 個注解:@SpringBootConfiguration额获、@EnableAutoConfiguration、@ComponentScan三個核心注解.
*@SpringBootConfiguration
作用與@Configuration注解相同恭应,都是標(biāo)識一個可以被組件掃描器掃描的配置類抄邀,只不過@SpringBootConfiguration是被Spring Boot進(jìn)行了重新封裝命名而已
(3). @EnableAutoConfiguration;
@EnableAutoConfiguration注解表示開啟自動配置功能昼榛,該注解是Spring Boot框架最重要的注
解境肾,也是實現(xiàn)自動化配置的注解。他是由@AutoConfigurationPackage注解和@Import({AutoConfigurationImportSelector.class})組合而成;
(4). @AutoConfigurationPackage:
這個組合注解主要是@Import(AutoConfigurationPackages.Registrar.class),它通過將Registrar類導(dǎo)入到容器中奥喻,而Registrar類作用是掃描主配置類同級目錄以及子包偶宫,并將相應(yīng)的組件導(dǎo)入到springboot創(chuàng)建管理
的容器中;
(5). @Import(AutoConfigurationImportSelector.class):它通過AutoConfigurationImportSelector類導(dǎo)入到容器中环鲤,AutoConfigurationImportSelector類作用是通過selectImports方法執(zhí)行的過程中纯趋,會使用內(nèi)部工具類SpringFactoriesLoader,查找classpath上所有jar包中METAINF/spring.factories進(jìn)行加載冷离,實現(xiàn)將配置類信息交給SpringFactory加載器進(jìn)行一系列的容器創(chuàng)建過程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吵冒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子西剥,更是在濱河造成了極大的恐慌痹栖,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞭空,死亡現(xiàn)場離奇詭異揪阿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)匙铡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門图甜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鳖眼,你說我怎么就攤上這事黑毅。” “怎么了钦讳?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵矿瘦,是天一觀的道長。 經(jīng)常有香客問我愿卒,道長缚去,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任琼开,我火速辦了婚禮易结,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘柜候。我一直安慰自己搞动,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布渣刷。 她就那樣靜靜地躺著鹦肿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辅柴。 梳的紋絲不亂的頭發(fā)上箩溃,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天瞭吃,我揣著相機(jī)與錄音,去河邊找鬼涣旨。 笑死歪架,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的开泽。 我是一名探鬼主播牡拇,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼穆律!你這毒婦竟也來了惠呼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤峦耘,失蹤者是張志新(化名)和其女友劉穎剔蹋,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辅髓,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡泣崩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了洛口。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矫付。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖第焰,靈堂內(nèi)的尸體忽然破棺而出买优,到底是詐尸還是另有隱情,我是刑警寧澤挺举,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布杀赢,位于F島的核電站,受9級特大地震影響湘纵,放射性物質(zhì)發(fā)生泄漏脂崔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一梧喷、第九天 我趴在偏房一處隱蔽的房頂上張望砌左。 院中可真熱鬧,春花似錦铺敌、人聲如沸绊困。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至煤蹭,卻和暖如春笔喉,著一層夾襖步出監(jiān)牢的瞬間取视,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工常挚, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留作谭,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓奄毡,卻偏偏與公主長得像折欠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吼过,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容