SpringBoot 源碼分析—@SpringBootApplication

前面的web項(xiàng)目,簡(jiǎn)短幾行代碼零配置文件辛掠,就能夠啟動(dòng)一個(gè)web工程,這是如何實(shí)現(xiàn)的呢释牺?
實(shí)質(zhì)上萝衩,SpringBoot幫我們做了很多自動(dòng)化的配置,這些配置是一個(gè)個(gè)配置組建共同構(gòu)成的

DemoApplication.java代碼如下

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

DemoApplication.java中核心內(nèi)容:

  • @SpringBootApplication注解
  • SpringApplication.run方法
    接下來没咙,我們就通過源碼SpringBoot究竟是怎樣的完成自動(dòng)化配置的猩谊,看看這里面究竟藏著怎樣的秘密。

要分析SpringBoot源碼祭刚,首先得搭建一個(gè)SpringBoot源碼工程牌捷,步驟如下

  • 在github上墙牌,下載springboot源碼并解壓
  • 安裝maven依賴
  • 在idea中打開springboot源碼工程
    SpringBoot 2.2.X 以前是采用maven構(gòu)建的,2.3.X以后是采用gradle構(gòu)建的暗甥,這里我使用maven喜滨,所以采用2.2.X來分析

1、@SpringBootApplication注解分析

圖片.png

點(diǎn)擊@SpringBootApplication源碼撤防,可以看到這個(gè)注解是一個(gè)組合注解
我將核心注解與基礎(chǔ)注解之前添加了一根分割線虽风,并在核心注解上加了說明,核心注解如下

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

1.1寄月、@SpringBootConfiguration

點(diǎn)擊@SpringBootConfiguration


圖片.png

可以看到只有一個(gè)org.springframework.context.annotation.@Configuration注解辜膝,此注解所標(biāo)記的類,會(huì)在Spring容器初始化的時(shí)候被掃描到漾肮,并解析其中的配置內(nèi)容(例如@Bean標(biāo)記的方法等)

1.2厂抖、@EnableAutoConfiguration

點(diǎn)擊@EnableAutoConfiguration


圖片.png

此注解上面又有兩個(gè)核心注解

  • @AutoConfigurationPackage
  • @Import(AutoConfigurationImportSelector.class)

1.2.1、@AutoConfigurationPackage源碼如下:

圖片.png

只有一個(gè)核心注解:

  • @Import(AutoConfigurationPackages.Registrar.class)
    借助@Import導(dǎo)入了AutoConfigurationPackages.Registrar類到IOC容器克懊,
    通過AutoConfigurationPackages.Registrar來注冊(cè)了一個(gè)類型為BasePackages的bean忱辅,其屬性中保存了basePackageName。1.2.2中會(huì)分析@Import谭溉。

1.2.2墙懂、@Import注解

@Import注解只有基礎(chǔ)注解,并有一個(gè) value()屬性夜只,用來接收一個(gè)Class垒在。


圖片.png

查看@Import注釋

圖片.png

譯:用于導(dǎo)入一個(gè)或多個(gè)組件類(通常是@Configuration所標(biāo)記的類)蒜魄。其特性與Spring XML 中的 <import/>標(biāo)簽類似扔亥, 可以導(dǎo)入 @Configuration標(biāo)記的類、ImportSelector 和 ImportBeanDefinitionRegistrar 的實(shí)現(xiàn)類谈为,以及普通Component組建(從 4.2 開始旅挤;類似于 AnnotationConfigApplicationContext.register)。
在導(dǎo)入的@Configuration 類中聲明的@Bean 定義伞鲫,可以通過@Autowired 來注入使用粘茄。 要么bean 本身可以被autowired,要么定義bean配置類實(shí)例可以被autowired秕脓。 后一種可以@Configuration 標(biāo)記的配置類方法之間進(jìn)行顯式的柒瓣、IDE 友好的導(dǎo)航跳轉(zhuǎn)》图埽可以標(biāo)記在類上或其他注解上芙贫。如果需要導(dǎo)入 XML 或其他非@Configuration bean 定義資源,請(qǐng)改用@ImportResource 注解傍药。
翻譯水平有限磺平,將就著看吧。簡(jiǎn)而言之:這是一個(gè)用于導(dǎo)入其他組建或者配置類的注解。

1.3 @ComponentScan

@SpringBootApplication中是這樣使用的:
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class)
})
@ComponentScan全路徑是org.springframework.context.annotation.@ComponentScan育韩,其本身是spring ioc中定義的宵晚,用于定義IOC容器初始化時(shí)應(yīng)該掃描并加載哪些包中的組建或配置類。
@Filter用于排除所指定的需要被掃描的包中的某些類菠劝。

至此赊舶,@SpringBootApplication注解相關(guān)代碼就分析完了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闸英,一起剝皮案震驚了整個(gè)濱河市锯岖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甫何,老刑警劉巖出吹,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異辙喂,居然都是意外死亡捶牢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門巍耗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秋麸,“玉大人,你說我怎么就攤上這事炬太【捏。” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵亲族,是天一觀的道長(zhǎng)炒考。 經(jīng)常有香客問我,道長(zhǎng)霎迫,這世上最難降的妖魔是什么斋枢? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮知给,結(jié)果婚禮上瓤帚,老公的妹妹穿的比我還像新娘。我一直安慰自己涩赢,他們只是感情好戈次,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著筒扒,像睡著了一般怯邪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上霎肯,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天擎颖,我揣著相機(jī)與錄音榛斯,去河邊找鬼。 笑死搂捧,一個(gè)胖子當(dāng)著我的面吹牛驮俗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播允跑,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼王凑,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了聋丝?” 一聲冷哼從身側(cè)響起索烹,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弱睦,沒想到半個(gè)月后百姓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡况木,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年垒拢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片火惊。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡求类,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屹耐,到底是詐尸還是另有隱情尸疆,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布惶岭,位于F島的核電站寿弱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏俗他。R本人自食惡果不足惜脖捻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一阔逼、第九天 我趴在偏房一處隱蔽的房頂上張望兆衅。 院中可真熱鬧,春花似錦嗜浮、人聲如沸羡亩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)畏铆。三九已至,卻和暖如春吉殃,著一層夾襖步出監(jiān)牢的瞬間辞居,已是汗流浹背楷怒。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓦灶,地道東北人鸠删。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像贼陶,于是被迫代替她去往敵國(guó)和親刃泡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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