笑死,面試官又問我SpringBoot自動配置原理

面試官:好久沒見,甚是想念。今天來聊聊SpringBoot的自動配置吧?

候選者:嗯,SpringBoot的自動配置我覺得是SpringBoot很重要的“特性”了。衆所周知,SpringBoot有着“約定大於配置”的理念,這一理念一定程度上可以用“SpringBoot自動配置”來解釋。

候選者:SpringBoot自動配置的原理理解起來挺簡單的,我們在使用SpringBoot的時候,肯定會依賴於autoconfigure這麼一個包

候選者:autoconfigure這個包裏會有一個spring.factories文件,該文件定義了100+個入口的配置類。比如我們經常使用的redis、kafka等等這樣常見的中間件都預置了配置類

候選者:當我們在啓動SpringBoot項目的時候,內部就會加載這個spring.factories文件,進而去加載“有需要”的配置類。那我們在使用相關組件的時候,就會非常的方便(因爲配置類已經初始化了一大部分配置信息)。

候選者:一般我們只要在application配置文件寫上對應的配置,就能通過各種template類直接操作對應的組件啦。

面試官:那是所有的配置類都會加載嗎?這個“有需要”的配置類你是怎麼理解的?

候選者:不是所有的配置類都會加載的,假設我們沒有引入redis-starter的包,那Redis的配置類就不會被加載。具體Spring在實現的時候就是使用 @ConditionalXXX進行判斷的。比如Redis的配置類就會有@ConditionalOnClass({RedisOperations.class})的配置,說明當前環境下如果有RedisOperations.class這個字節碼,纔會去加載Redis的配置類

面試官:哦,這樣啊,那瞭解了。那你知不知道Redis的配置類其實會有初始化RedisTemplate對象的操作,那假設我們沒有引入redis-starter包,那他是怎麼通過編譯的?(當然了,其他的配置類也是有可能有一樣的狀況)

候選者:嗯,這個我看源碼的時候我也發現了。其實就是在autoconfigure包裏會定義到相關的依賴,但只是標記爲optional並且只在編譯環境有效。那這樣是能通過編譯的,只是不會將其依賴傳入到我們的應用工程裏

候選者:這塊還是花了我很多時間的,我最後在GitHub 的SpringBoot源碼裏找到的。

面試官:嗯啊,有點東西的喲。既然都聊到這塊了,要不順便聊聊你對SpringBoot starter的理解?

候選者:嗯,starter這東西就是爲了方便調用方去使用相關的組件的嘛,Spring框架也給我們實現了很多好用的starter。

候選者:比如以前我們要用Mybatis框架,可能會引入各種的包才能使用。而starter就是做了一層封裝,把相關要用到的jar都給包起來了,並且也寫好了對應的版本。這我們使用的時候就不需要引入一堆jar包且管理版本類似的問題了。

候選者:現在很多開源的組件都會提供對應的springboot-starter包給我們去用,要做一個starter包並不難。參照Spring內置的實現就好了:1、在工程裏引入 starter 打包相關的依賴。2、在我們工程內建spring.factories文件,編寫我們配置類的全限類名。

面試官:嗯,大致都瞭解了,可以的。最後聊下你是怎麼看這塊源碼的?

候選者:源碼具體大概就不記得了,思路倒是還有的。我先從啓動類開始,會有個@SpringBootApplication,後面會定位到一個自動配置的註解@EnableAutoConfiguration,那最後就能看到註解內部會去META-INF/spring.factories加載配置類

候選者:這塊源碼並不難,這個過程也瞭解到了原來maven有option和scope這倆標籤,但確實是SpringBoot比較重要的概念吧。

面試官:好嘞,今天到這就結束了吧。

題外:自動配置這個問題確實被問到過幾次。說實在的,對於Spring類、註解的信息我真的記不住。感覺能答出這個流程思路,也就夠用了(如果面試官確實是要細究某個類名,那這種公司不去也罷)

約定大於配置:SpringBoot給我們內置了很多配置類,這些配置類也初始化了很多配置(默認值)。當我們要使用的時候,只需要覆蓋這些配置項就完事了。即便我們不寫,大多數情況下都不需要由我們顯示配置出來,但相關組件就能正常訪問了。

推薦項目

如果想學Java項目的,我還是強烈推薦我的開源項目消息推送平臺Austin,可以用作畢業設計,可以用作校招,可以看看生產環境是怎麼推送消息的。

Gitee倉庫地址:https://gitee.com/zhongfucheng/austin

GitHub倉庫地址:https://github.com/ZhongFuCheng3y/austin

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章