鬆哥整理了 15 道 Spring Boot 高頻面試題,看完當面霸

什麼是麪霸?就是在面試中,神擋殺神佛擋殺佛,見招拆招,面到面試官自慚形穢自嘆不如!鬆哥但願本文能成爲你麪霸路上的墊腳石!前端

作 Java 開發,沒有人敢小覷 Spring Boot 的重要性,如今出去面試,不管多小的公司 or 項目,都要跟你扯一扯 Spring Boot,扯一扯微服務,不會?沒用過? Sorry ,咱們不合適!java

今天鬆哥就給你們整理了 15 道高頻 Spring Boot 面試題,但願可以幫助到剛剛走出校門的小夥伴以及準備尋找新的工做機會的小夥伴。面試

  • 1.什麼是 Spring Boot ?

傳統的 SSM/SSH 框架組合配置繁瑣臃腫,不一樣項目有不少重複、模板化的配置,嚴重下降了 Java 工程師的開發效率,而 Spring Boot 能夠輕鬆建立基於 Spring 的、能夠獨立運行的、生產級的應用程序。經過對 Spring 家族和一些第三方庫提供一系列自動化配置的 Starter,來使得開發快速搭建一個基於 Spring 的應用程序。spring

Spring Boot 讓日益臃腫的 Java 代碼又重回簡潔。在配合 Spring Cloud 使用時,還能夠發揮更大的威力。數據庫

  • 2.Spring Boot 有哪些特色 ?

Spring Boot 主要有以下特色:bootstrap

  1. 爲 Spring 開發提供一個更快、更普遍的入門體驗。
  2. 開箱即用,遠離繁瑣的配置。
  3. 提供了一系列大型項目通用的非業務性功能,例如:內嵌服務器、安全管理、運行數據監控、運行情況檢查和外部化配置等。
  4. 絕對沒有代碼生成,也不須要XML配置。
  • 3.Spring Boot 中的 starter 究竟是什麼 ?

首先,這個 Starter 並不是什麼新的技術點,基本上仍是基於 Spring 已有功能來實現的。首先它提供了一個自動化配置類,通常命名爲 XXXAutoConfiguration ,在這個配置類中經過條件註解來決定一個配置是否生效(條件註解就是 Spring 中本來就有的),而後它還會提供一系列的默認配置,也容許開發者根據實際狀況自定義相關配置,而後經過類型安全的屬性注入將這些配置屬性注入進來,新注入的屬性會代替掉默認屬性。正由於如此,不少第三方框架,咱們只須要引入依賴就能夠直接使用了。後端

固然,開發者也能夠自定義 Starter,自定義 Starter 能夠參考:徒手擼一個 Spring Boot 中的 Starter ,解密自動化配置黑魔法!跨域

  • 4.spring-boot-starter-parent 有什麼用 ?

咱們都知道,新建立一個 Spring Boot 項目,默認都是有 parent 的,這個 parent 就是 spring-boot-starter-parent ,spring-boot-starter-parent 主要有以下做用:數組

  1. 定義了 Java 編譯版本爲 1.8 。
  2. 使用 UTF-8 格式編碼。
  3. 繼承自 spring-boot-dependencies,這個裏邊定義了依賴的版本,也正是由於繼承了這個依賴,因此咱們在寫依賴時纔不須要寫版本號。
  4. 執行打包操做的配置。
  5. 自動化的資源過濾。
  6. 自動化的插件配置。
  7. 針對 application.properties 和 application.yml 的資源過濾,包括經過 profile 定義的不一樣環境的配置文件,例如 application-dev.properties 和 application-dev.yml。

關於這個問題,讀者能夠參考:你真的理解 Spring Boot 項目中的 parent 嗎?安全

  • 5.YAML 配置的優點在哪裏 ?

YAML 如今能夠算是很是流行的一種配置文件格式了,不管是前端仍是後端,均可以見到 YAML 配置。那麼 YAML 配置和傳統的 properties 配置相比到底有哪些優點呢?

  1. 配置有序,在一些特殊的場景下,配置有序很關鍵
  2. 支持數組,數組中的元素能夠是基本數據類型也能夠是對象
  3. 簡潔

相比 properties 配置文件,YAML 還有一個缺點,就是不支持 @PropertySource 註解導入自定義的 YAML 配置。

關於 YAML 配置,要是你們還不熟悉,能夠參考: Spring Boot 中的 yaml 配置簡介

  • 6.Spring Boot 中如何解決跨域問題 ?

跨域能夠在前端經過 JSONP 來解決,可是 JSONP 只能夠發送 GET 請求,沒法發送其餘類型的請求,在 RESTful 風格的應用中,就顯得很是雞肋,所以咱們推薦在後端經過 (CORS,Cross-origin resource sharing) 來解決跨域問題。這種解決方案並不是 Spring Boot 特有的,在傳統的 SSM 框架中,就能夠經過 CORS 來解決跨域問題,只不過以前咱們是在 XML 文件中配置 CORS ,如今則是經過 @CrossOrigin 註解來解決跨域問題。關於 CORS ,小夥伴們能夠參考:Spring Boot 中經過 CORS 解決跨域問題

  • 7.比較一下 Spring Security 和 Shiro 各自的優缺點 ?

因爲 Spring Boot 官方提供了大量的很是方便的開箱即用的 Starter ,包括 Spring Security 的 Starter ,使得在 Spring Boot 中使用 Spring Security 變得更加容易,甚至只須要添加一個依賴就能夠保護全部的接口,因此,若是是 Spring Boot 項目,通常選擇 Spring Security 。固然這只是一個建議的組合,單純從技術上來講,不管怎麼組合,都是沒有問題的。Shiro 和 Spring Security 相比,主要有以下一些特色:

  1. Spring Security 是一個重量級的安全管理框架;Shiro 則是一個輕量級的安全管理框架
  2. Spring Security 概念複雜,配置繁瑣;Shiro 概念簡單、配置簡單
  3. Spring Security 功能強大;Shiro 功能簡單
  • 8.微服務中如何實現 session 共享 ?

在微服務中,一個完整的項目被拆分紅多個不相同的獨立的服務,各個服務獨立部署在不一樣的服務器上,各自的 session 被從物理空間上隔離開了,可是常常,咱們須要在不一樣微服務之間共享 session ,常見的方案就是 Spring Session + Redis 來實現 session 共享。將全部微服務的 session 統一保存在 Redis 上,當各個微服務對 session 有相關的讀寫操做時,都去操做 Redis 上的 session 。這樣就實現了 session 共享,Spring Session 基於 Spring 中的代理過濾器實現,使得 session 的同步操做對開發人員而言是透明的,很是簡便。 session 共享你們能夠參考:Spring Boot 一個依賴搞定 session 共享,沒有比這更簡單的方案了!

  • 9.Spring Boot 如何實現熱部署 ?

Spring Boot 實現熱部署其實很容易,引入 devtools 依賴便可,這樣當編譯文件發生變化時,Spring Boot 就會自動重啓。在 Eclipse 中,用戶按下保存按鍵,就會自動編譯進而重啓 Spring Boot,IDEA 中因爲是自動保存的,自動保存時並未編譯,因此須要開發者按下 Ctrl+F9 進行編譯,編譯完成後,項目就自動重啓了。

若是僅僅只是頁面模板發生變化,Java 類並未發生變化,此時能夠不用重啓 Spring Boot,使用 LiveReload 插件就能夠輕鬆實現熱部署。

  • 10.Spring Boot 中如何實現定時任務 ?

定時任務也是一個常見的需求,Spring Boot 中對於定時任務的支持主要仍是來自 Spring 框架。

在 Spring Boot 中使用定時任務主要有兩種不一樣的方式,一個就是使用 Spring 中的 @Scheduled 註解,另外一個則是使用第三方框架 Quartz。

使用 Spring 中的 @Scheduled 的方式主要經過 @Scheduled 註解來實現。

使用 Quartz ,則按照 Quartz 的方式,定義 Job 和 Trigger 便可。

關於定時任務這一塊,你們能夠參考:Spring Boot 中實現定時任務的兩種方式!

  • 11.先後端分離,如何維護接口文檔 ?

先後端分離開發日益流行,大部分狀況下,咱們都是經過 Spring Boot 作先後端分離開發,先後端分離必定會有接口文檔,否則會先後端會深深陷入到扯皮中。一個比較笨的方法就是使用 word 或者 md 來維護接口文檔,可是效率過低,接口一變,全部人手上的文檔都得變。在 Spring Boot 中,這個問題常見的解決方案是 Swagger ,使用 Swagger 咱們能夠快速生成一個接口文檔網站,接口一旦發生變化,文檔就會自動更新,全部開發工程師訪問這一個在線網站就能夠獲取到最新的接口文檔,很是方便。關於 Swagger 的用法,你們能夠參考:SpringBoot整合Swagger2,不再用維護接口文檔了!

  • 12.什麼是 Spring Data ?

Spring Data 是 Spring 的一個子項目。用於簡化數據庫訪問,支持NoSQL 和 關係數據存儲。其主要目標是使數據庫的訪問變得方便快捷。Spring Data 具備以下特色:

  1. SpringData 項目支持 NoSQL 存儲:
  2. MongoDB (文檔數據庫)
  3. Neo4j(圖形數據庫)
  4. Redis(鍵/值存儲)
  5. Hbase(列族數據庫)

SpringData 項目所支持的關係數據存儲技術:

  1. JDBC
  2. JPA

Spring Data Jpa 致力於減小數據訪問層 (DAO) 的開發量. 開發者惟一要作的,就是聲明持久層的接口,其餘都交給 Spring Data JPA 來幫你完成!Spring Data JPA 經過規範方法的名字,根據符合規範的名字來肯定方法須要實現什麼樣的邏輯。

  • 13.Spring Boot 是否可使用 XML 配置 ?

Spring Boot 推薦使用 Java 配置而非 XML 配置,可是 Spring Boot 中也可使用 XML 配置,經過 @ImportResource 註解能夠引入一個 XML 配置。

  • 14.Spring Boot 打成的 jar 和普通的 jar 有什麼區別 ?

Spring Boot 項目最終打包成的 jar 是可執行 jar ,這種 jar 能夠直接經過 java -jar xxx.jar 命令來運行,這種 jar 不能夠做爲普通的 jar 被其餘項目依賴,即便依賴了也沒法使用其中的類。

Spring Boot 的 jar 沒法被其餘項目依賴,主要仍是他和普通 jar 的結構不一樣。普通的 jar 包,解壓後直接就是包名,包裏就是咱們的代碼,而 Spring Boot 打包成的可執行 jar 解壓後,在 \BOOT-INF\classes 目錄下才是咱們的代碼,所以沒法被直接引用。若是非要引用,能夠在 pom.xml 文件中增長配置,將 Spring Boot 項目打包成兩個 jar ,一個可執行,一個可引用。

  • 15.bootstrap.properties 和 application.properties 有何區別 ?

單純作 Spring Boot 開發,可能不太容易遇到 bootstrap.properties 配置文件,可是在結合 Spring Cloud 時,這個配置就會常常遇到了,特別是在須要加載一些遠程配置文件的時侯。

bootstrap.properties 在 application.properties 以前加載,配置在應用程序上下文的引導階段生效。通常來講咱們在 Spring Cloud Config 或者 Nacos 中會用到它。bootstrap.properties 被 Spring ApplicationContext 的父類加載,這個類先於加載 application.properties 的 ApplicatonContext 啓動。

固然,前面敘述中的 properties 也能夠修改成 yaml 。

好了,本文就說到這裏,歡迎小夥伴留言說說你曾經遇到過的 Spring Boot 面試題!

關注公衆號牧碼小子,專一於 Spring Boot+微服務以及先後端分離等全棧技術,按期視頻教程分享,關注後回覆 Java ,領取鬆哥爲你精心準備的 Java 乾貨!

相關文章
相關標籤/搜索