Spring Boot 必問面試題精選

1.簡介

自Spring Boot誕生以來想暗,就引起了業(yè)界轟動嚷量,目前越來越多的公司技術選型選擇擁抱Spring Boot镇饮。所以Spring Boot也成為面試必問的問題之一取逾。接下來小胖哥總結(jié)了一些來開闊你的思路耗绿。

2.問題

好了接下來直奔主題說說經(jīng)常在面試中問到的 **Spring Boot **面試題

Q1。Spring和Spring Boot有什么區(qū)別砾隅?

Spring Framework提供了多種功能误阻,使Web應用程序的開發(fā)更加容易。這些功能包括依賴注入晴埂,數(shù)據(jù)綁定究反,面向方面的編程,數(shù)據(jù)訪問等等儒洛。
隨著Spring社區(qū)的壯大奴紧,Spring慢慢變得越來越復雜,不再像開始宣稱的那么輕量級晶丘。 開發(fā)應用程序的配置量越來越大令開發(fā)者頭疼。這時Spring Boot就派上用場了 - 它采用“約定大于配置”的思想簡化了配置唐含,對Spring提供的功能和配置而且將一些功能抽象成為“Starter”開箱即用浅浮、按需引用。極大地簡化了開發(fā)捷枯。

Q2滚秩。我們?nèi)绾问褂肕aven設置Spring Boot應用程序?

我們可以像在任何其他庫中一樣在Maven項目中包含Spring Boot淮捆。但是郁油,最好的方法是從spring-boot-starter-parent項目繼承并聲明依賴于Spring Boot啟動器。這樣做可以讓我們的項目重用Spring Boot的默認設置攀痊。
繼承spring-boot-starter-parent項目非常簡單 - 我們只需要在 pom.xml 中指定一個 parent 元素:

file

我們可以在Maven 中央倉庫找到最新版本的 spring-boot-starter-parent桐腌。
上面的方式很方便但是并不一定符合實際需要。例如公司要求所有項目依賴構(gòu)建從一個標準BOM開始苟径,我們就不能按上面的方式進行案站。
在這種情況下,我們可以進行如下引用:

file

然后在 dependencies 標簽下引用Spring Boot 的starters 就行了棘街。

Q3蟆盐。Spring boot 中的starter是什么承边?

依賴管理對于項目至關重要。當項目足夠復雜時石挂,管理依賴項可能會變成一場噩夢博助,因為涉及的組件太多了。
這就是Spring Boot 的 starter 就派上用場了痹愚。每個starter都可以為我們提供所需要的Spring技術的一站式服務富岳。并且以一致的方式傳遞和管理其他所需的依賴關系。
所有官方starter都在 org.springframework.boot 組下里伯,其名稱以 spring-boot-starter- 開頭 城瞎。非官方的starter的名稱在前,如 mybatis-spring-boot-starter疾瓮。這種命名模式使得查找啟動器變得很容易脖镀,尤其是在使用支持按名稱搜索依賴關系的IDE時。但是這個不是絕對的狼电,有些開發(fā)者可能不遵從這種契約蜒灰。
目前大概有超過50種官方starter。最常用的是:

  • spring-boot-starter: 核心啟動器肩碟,包括自動配置支持强窖,日志記錄和YAML
  • spring-boot-starter-aop: 使用Spring AOPAspectJ進行面向方面編程的初學者
  • spring-boot-starter-data-jpa: 使用Spring Data JPAHibernate的啟動器
  • spring-boot-starter-jdbc: 用于將JDBCHikariCP連接池一起使用的啟動器
  • spring-boot-starter-security: 使用Spring Security的啟動器
  • spring-boot-starter-test: 用于測試Spring Boot應用程序的啟動器
  • spring-boot-starter-web: 使用Spring MVC構(gòu)建Web的啟動器,包括RESTful應用程序

其他starter 可去spring.io查詢

Q4削祈。如何禁用特定的自動配置翅溺?

如果我們要禁用特定的自動配置,我們可以使用@EnableAutoConfiguration注解的exclude屬性來指示它髓抑。如下禁用了數(shù)據(jù)源自動配置DataSourceAutoConfiguration

file

如果我們使用@SpringBootApplication注解咙崎。 它具有@EnableAutoConfiguration作為元注解 - 我們同樣可以配置exclude屬性來禁用自動配置:

file

我們還可以使用spring.autoconfigure.exclude環(huán)境屬性禁用自動配置。在application.properties(也可以是application.yml)配置文件設置如下也可以達到同樣的目的:

file

Q5吨拍。如何注冊自定義自動配置褪猛?

要注冊自動配置類,我們必須在META-INF / spring.factories文件的EnableAutoConfiguration鍵(key)下列出其完全限定名稱羹饰,如果是多個按照以下風格配置:

file

如果我們使用Maven構(gòu)建一個項目伊滋,那么該文件應放在resources / META-INF目錄中。

Q6队秩。如何根據(jù)不同的條件來加載bean笑旺?

使用@Conditional系列注解。 例如@ConditionalOnMissingBean馍资。此注釋的最顯著屬性是:

  • value:要檢查的bean類型
  • name:要檢查的bean的名稱
    放置在使用@Bean裝飾的方法上時燥撞,目標類型默認為方法的返回類型:
file

表示的意思是如果不存在CustomService類型的bean則初始化并注入該bean。

Q7。如何將Spring Boot Web應用程序部署為JAR和WAR文件物舒?

傳統(tǒng)上色洞,我們將Web應用程序打包為WAR文件,然后將其部署到外部服務器中冠胯。這樣做可以讓我們在同一臺服務器上安排多個應用程序火诸。在CPU和內(nèi)存稀缺的時候,這是節(jié)省資源的好方法荠察。
但事情發(fā)生了變化≈檬瘢現(xiàn)在計算機硬件相當便宜,并且注意力轉(zhuǎn)向服務器配置悉盆。在部署期間配置服務器的一個小錯誤可能會導致災難性后果盯荤。
Spring通過提供一個插件即spring-boot-maven-plugin來解決這個問題,將Web應用程序打包為可執(zhí)行的JAR焕盟。要包含此插件秋秤,只需向pom.xml添加一個插件元素:

file

有了這個插件,我們將在執(zhí)行包階段后得到一個fat JAR 脚翘。此JAR包含所有必需的依賴項灼卢,包括嵌入式服務器。因此来农,我們不再需要擔心配置外部服務器鞋真。
然后我們可以像運行普通的可執(zhí)行JAR一樣運行應用程序。
請注意沃于,必須將pom.xml文件中的packaging元素設置為 jar 才能構(gòu)建JAR文件:

file

如果我們不包含這個元素涩咖,它也默認為jar
如果我們想要構(gòu)建WAR文件繁莹,請將包裝 元素更改為war

file

并將容器依賴關系從打包文件中刪除:

file

執(zhí)行Maven 包階段后抠藕,我們將擁有一個可部署的WAR文件。

Q8蒋困。如何在Spring Boot啟動的時候運行一些邏輯?

可以實現(xiàn)接口 ApplicationRunner 或者者 CommandLineRunner敬辣,這兩個接口實現(xiàn)方式一樣雪标,它們都只提供了一個 run 方法。更加詳細的操作參見我公眾號:Felordcn 中的相關文章溉跃。

Q9村刨。Spring boot支持哪些外部配置?

Spring Boot支持外部配置撰茎,允許我們在各種環(huán)境中運行相同的應用程序嵌牺。我們可以使用properties文件,YAML文件,環(huán)境變量逆粹,系統(tǒng)屬性和命令行選項參數(shù)來指定配置屬性募疮。
然后,我們可以訪問使用這些屬性@Value注釋僻弹,經(jīng)由綁定對象 的@ConfigurationProperties注釋或Environment環(huán)境抽象類注入阿浓。
以下是最常見的外部配置來源:

  • 命令行屬性:命令行選項參數(shù)是以雙連字符開頭的程序參數(shù),例如-server.port = 8080蹋绽。Spring Boot將所有參數(shù)轉(zhuǎn)換為屬性芭毙,并將它們添加到環(huán)境屬性集中。
  • 應用程序?qū)傩裕簯贸绦驅(qū)傩允菑?code>application.properties文件或其YAML對應文件加載的屬性卸耘。默認情況下退敦,Spring Boot會在當前目錄,類路徑根或其config子目錄中搜索此文件蚣抗。
    特定于配置文件的屬性:特定于配置文件的屬性從application- {profile} .properties文件或其YAML對應文件加載侈百。{profile}占位符是指活性輪廓。這些文件與非特定屬性文件位于相同位置忠聚,并且優(yōu)先于非特定屬性文件设哗。

Q10。如何對Spring Boot應用進行測試两蟀?

在為Spring應用程序運行集成測試時网梢,我們必須有一個ApplicationContext
為了簡化測試赂毯,Spring Boot為測試提供了一個特殊的注釋 @SpringBootTest战虏。此批注從其classes屬性指示的配置類創(chuàng)建ApplicationContext
如果未設置classes屬性党涕,Spring Boot將搜索主配置類烦感。搜索從包含測試的包開始,直到找到使用@SpringBootApplication或@SpringBootConfiguration注釋的類膛堤。
請注意手趣,如果我們使用JUnit 4,我們必須用@RunWith(SpringRunner.class)裝飾測試類肥荔÷淘可以查閱 文章Spring Boot 2 實戰(zhàn):mock測試你的web應用

Q11 燕耿。 Spring Boot Actuator有什么用中符?

Spring Boot Actuator可以幫助你監(jiān)控和管理Spring Boot應用,比如健康檢查誉帅、審計淀散、統(tǒng)計和HTTP追蹤等右莱。所有的這些特性可以通過JMX或者HTTP endpoints來獲得。
Actuator同時還可以與外部應用監(jiān)控系統(tǒng)整合档插,比如 Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic等慢蜓。這些系統(tǒng)提供了非常好的儀表盤、圖標阀捅、分析和告警等功能胀瞪,使得你可以通過統(tǒng)一的接口輕松的監(jiān)控和管理你的應用。
Actuator使用Micrometer來整合上面提到的外部應用監(jiān)控系統(tǒng)饲鄙。這使得只要通過非常小的配置就可以集成任何應用監(jiān)控系統(tǒng)凄诞。
將Spring Boot Actuator集成到一個項目中非常簡單。我們需要做的就是在pom.xml文件中包含 spring-boot-starter-actuator啟動器:

file

Spring Boot Actuator可以使用HTTPJMX端點公開操作信息忍级。但是帆谍,大多數(shù)應用程序都使用HTTP,其中端點的標識和/執(zhí)行器前綴形成URL路徑轴咱。
以下是Actuator提供的一些最常見的內(nèi)置端點:

  • auditevents: 公開審計事件信息
  • env: 公開環(huán)境屬性
  • health: 顯示應用程序運行狀況信息
  • httptrace: 顯示HTTP跟蹤信息
  • info: 顯示任意應用程序信息
  • metrics: 顯示指標信息
  • mappings: 顯示所有@RequestMapping路徑的列表
  • scheduledtasks: 顯示應用程序中的計劃任務
  • threaddump: 執(zhí)行線程轉(zhuǎn)儲
  • `beans :所有加載的spring bean

更多關于Spring Boot Actuator 的信息可查看Spring Boot 2.x 中的 Actuator 汛蝙。
請注意:生產(chǎn)使用Actuator務必保護好這些端點,避免未授權(quán)的訪問請求朴肺。

3.結(jié)論

今天小胖哥介紹了在技術面試中經(jīng)常遇到的一些關于Spring Boot的最關鍵問題窖剑。掌握以上的知識在日常開發(fā)中也是必要的,希望對你的面試有所幫助戈稿。以上相關知識點在我個人博客都有詳細的介紹西土。

關注公眾號:碼農(nóng)小胖哥,獲取更多資訊

個人博客:https://felord.cn

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鞍盗,一起剝皮案震驚了整個濱河市需了,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌般甲,老刑警劉巖肋乍,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異敷存,居然都是意外死亡墓造,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門锚烦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來觅闽,“玉大人,你說我怎么就攤上這事挽牢。” “怎么了摊求?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵禽拔,是天一觀的道長。 經(jīng)常有香客問我,道長睹栖,這世上最難降的妖魔是什么硫惕? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮野来,結(jié)果婚禮上恼除,老公的妹妹穿的比我還像新娘。我一直安慰自己曼氛,他們只是感情好豁辉,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舀患,像睡著了一般徽级。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上聊浅,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天餐抢,我揣著相機與錄音,去河邊找鬼低匙。 笑死旷痕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的顽冶。 我是一名探鬼主播欺抗,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼渗稍!你這毒婦竟也來了佩迟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤竿屹,失蹤者是張志新(化名)和其女友劉穎报强,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拱燃,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡秉溉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了碗誉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片召嘶。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哮缺,靈堂內(nèi)的尸體忽然破棺而出弄跌,到底是詐尸還是另有隱情,我是刑警寧澤尝苇,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布铛只,位于F島的核電站埠胖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏淳玩。R本人自食惡果不足惜直撤,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜕着。 院中可真熱鬧谋竖,春花似錦、人聲如沸承匣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悄雅。三九已至驱敲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宽闲,已是汗流浹背众眨。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留容诬,地道東北人娩梨。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像览徒,于是被迫代替她去往敵國和親狈定。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

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