上一篇文章說了說Spring容器的做用,此次趁熱打鐵,看看Spring Boot中它是怎麼起做用的。html
有了Spring容器以後,開發的模式簡化了不少,你的注意力基本只須要集中在編寫Bean上,好比@Controller類呀,@Service類呀,@Repository類呀等等。你新建了一個Spring Boot應用以後,隨便編寫一個控制器(Controller),他就能夠用來處理網絡請求了。按理說,一個控制器成爲容器中的Bean,得有@ComponentScan來掃描呀,可是新建的應用也沒看到有配置類,更不用說依靠在其之上的@ComponentScan註解了。這一些都要從@SpringBootApplication提及。git
上圖是很常見的Application類,用Spring Initializr生成的項目都有。它有個@SpringBootApplication註解,這個註解提供了Spring Boot的不少關鍵特性。咱們打開SpringBootApplication的源碼看一看:github
@SpringBootApplication是個組合註解(composed annotation),用它就至關於同時用了下面三個註解:spring
Spring提供的不少註解都是元註解,組合註解就是由一個或者多個元註解組合成的。比方說@RestController,你寫純API服務的時候,控制器通常都用上它,它是由@Controller和@ResponseBody組合而成的,你直接把@RestController替換成這兩個,是能夠的,他們是等效的。網絡
若是你細心的話,會發現@Controller也是一個組合註解,元註解是@Component,因此說爲何組件掃描能掃描到@Controller,緣由就在這裏。app
一個註解多是元註解,也多是組合註解,它倆只是個相對的概念。實際開發中,若是你的一個組件類加了好多註解,不妨本身去建立一個新的組合註解,這樣更清晰簡潔。更多相關內容,你能夠看看Spring文檔裏關於元註解和組合註解的詳細說明。spring-boot
廢了這麼多口舌,我就是想告訴你@SpringBootApplication目的就是爲了方便地引入它的三個元註解。post
剛纔咱們說到了@ComponentScan,它用來告訴Spring容器去掃描組件,可是去哪裏掃描呢?它有一個String[]類型的註解參數basePackages,能夠傳入須要掃描的路徑,若是你不傳,那就以當前類的包做爲路徑。因此這麼一來,你的Application類在哪一個包裏,自動掃描就在哪一個包裏掃。你只要在這個包或者子包裏編寫@Controller類或者其餘@Component類,都會被掃到的。假設你的Application類所在的包爲com.fookwood.demo,那建議你全部的代碼都放這個包下,免得由於組件沒放入容器而出錯。gradle
咱們知道@ComponentScan都是跟着配置類一塊兒出現的,可是沒見哪裏有@Configuration呀?由於有@SpringBootConfiguration了,他是個組合註解,把@Configuration帶來了。話說我找了不少資料,沒有發現@SpringBootConfiguration到底有什麼獨特做用,它的註釋上說一個程序一般只須要一個@SpringBootConfiguration就好了,並且大部分都是從@SpringBootApplication獲取的。那乾脆無論了,就當他是個@Configuration吧。ui
最後,該討論下@EnableAutoConfiguration了。他開啓了Spring Boot中最重要的特性—自動配置,自動配置能夠根據你引入的依賴自動生成Bean等。大部分依賴都有對應一個叫作*AutoConfiguration的類,好比GSON有一個對應的GsonAutoConfiguration類:
看圖,他是一個正常的配置類,有@Configuration註解,可是呢,它的方法提供的Bean並非直接加到容器裏的,而是須要知足必定條件才行。條件呢,經過@Conditional* 註解提供,GsonAutoConfiguration使用了@ConditionalOnClass註解,它的參數是Gson.class,意思就是,當類路徑中有Gson這個類的時候,GsonAutoConfiguration纔是一個真正的配置類。圖中的gsonBuilder方法新建了一個GsonBuilder對象,若是容器裏沒有這個類型的Bean,就使用新建的這個對象。圖中的gson方法,新建了一個Gson對象,若是容器裏沒有Gson類型的Bean,就把這個對象放進去。
因此說,一旦你在build.gradle中添加了GSON的依賴,那麼你就能夠直接在本身的代碼裏引入Gson對象了,省事兒不?你要是想定義本身的Gson對象,固然能夠,你能夠在本身的配置類,添加你本身的GsonBuilder對象或者Gson對象,這樣的話,自動配置判斷容器裏已經有了,@Conditional*的條件不成立,就不本身搞了。
再提一句吧,雖然你的Application類(好比本文最上面的WhatEverApplication)也是一個配置類,你能夠添加方法來建立新的Bean,不過我不喜歡這麼這麼作,我一般是新建單獨的配置類,好比新建一個名爲WebConfig的類,在這個類裏定義Web開發相關的Bean。