1. 程式人生 > >天天用SpringBoot居然還不知道它的自動裝配的原理?

天天用SpringBoot居然還不知道它的自動裝配的原理?

### 引言 最近有個讀者在面試,面試中被問到了這樣一個問題“看你專案中用到了`springboot`,你說下`springboot`的自動配置是怎麼實現的?”這應該是一個`springboot`裡面最最常見的一個面試題了。下面我們就來帶著這個問題一起解剖下`springBoot`的自動配置原理吧。 ### SpringMvc和SpringBoot對比 首先我們回顧下原來搭建一個`springmvc`的`hello-word`的`web`專案(`xml`配置的)我們是不是要在`pom`中匯入各種依賴,然後各個依賴有可能還會存在版本衝突需要各種排除。當你歷盡千辛萬苦的把依賴解決了,然後還需要編寫`web.xml、springmvc.xml`配置檔案等。我們只想寫`個hello-word`專案而已,確把一大把的時間都花在了配置檔案和`jar`包的依賴上面。大大的影響了我們開發的效率,以及加大了`web`開發的難度。為了簡化這複雜的配置、以及各個版本的衝突依賴關係,`springBoot`就應運而生。我們現在通過`idea`建立一個`springboot`專案只要分分鐘就解決了,你不需要關心各種配置(基本實現零配置)。讓你真正的實現了開箱即用。`SpringBoot`幫你節約了大量的時間去陪女朋友,不對程式設計師怎麼會有女朋友呢?(**沒有的話也是可以new一個的**)它的出現不僅可以讓你把更多的時間都花在你的業務邏輯開發上,而且還大大的降低了`web`開發的門檻。所以`SpringBoot`還是比較善解人衣的,錯啦錯啦是善解人意,知道開發人員的痛點在哪。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200723225955205.png) ### SpringBoot自動配置載入 既然`Springboot`儘管這麼好用,但是作為一個使用者,我們還是比較好奇它是怎麼幫我們實現開箱即用的。`Spring Boot`有一個全域性配置檔案:`application.properties或application.yml`。在這個全域性檔案裡面可以配置各種各樣的引數比如你想改個埠啦`server.port` 或者想調整下日誌的級別啦通通都可以配置。更多其他可以配置的屬性可以參照官網。https://docs.spring.io/spring-boot/docs/2.3.0.RELEASE/reference/htmlsingle/#common-application-properties ![ ](https://img-blog.csdnimg.cn/20200720224048800.png) 這麼多屬性,這些屬性在專案是怎麼起作用的呢?`SpringBoot`專案看下來啥配置也沒有,配置”(`application.properties或application.yml`除外),既 然從配置上面找不到突破口,那麼我們就只能從啟動類上面找入口了。啟動類也就一個光禿禿的一個`main`方法,類上面僅有一個注`SpringBootApplication` 這個註解是`Spring Boot`專案必不可少的註解。那麼自動配置原理一定和這個註解有著千絲萬縷的聯絡!我們下面來一起看看這個註解吧。 **@SpringBootApplication註解** ```java @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication { ``` 這裡最上面四個註解的話沒啥好說的,基本上自己實現過自定義註解的話,都知道分別是什麼意思。 - `@SpringBootConfiguration`繼承自`@Configuration`,二者功能也一致,標註當前類是配置類。 - `@ComponentScan`用於類或介面上主要是指定掃描路徑,跟Xml