做 Java 開發(fā),沒有人敢小覷 Spring Boot 的重要性,現(xiàn)在出去面試,無論多小的公司 or 項(xiàng)目,都要跟你扯一扯 Spring Boot,扯一扯微服務(wù),不會(huì)?沒用過? Sorry ,我們不合適!
今天松哥就給大家整理了 15 道高頻 Spring Boot 面試題,希望能夠幫助到剛剛走出校門的小伙伴以及準(zhǔn)備尋找新的工作機(jī)會(huì)的小伙伴。
1.什么是 Spring Boot ?
傳統(tǒng)的 SSM/SSH 框架組合配置繁瑣臃腫,不同項(xiàng)目有很多重復(fù)、模板化的配置,嚴(yán)重降低了 Java 工程師的開發(fā)效率,而 Spring Boot 可以輕松創(chuàng)建基于 Spring 的、可以獨(dú)立運(yùn)行的、生產(chǎn)級(jí)的應(yīng)用程序。通過對(duì) Spring 家族和一些第三方庫提供一系列自動(dòng)化配置的 Starter,來使得開發(fā)快速搭建一個(gè)基于 Spring 的應(yīng)用程序。
Spring Boot 讓日益臃腫的 Java 代碼又重回簡潔。在配合 Spring Cloud 使用時(shí),還可以發(fā)揮更大的威力。
2.Spring Boot 有哪些特點(diǎn) ?
Spring Boot 主要有如下特點(diǎn):
為 Spring 開發(fā)提供一個(gè)更快、更廣泛的入門體驗(yàn)。
開箱即用,遠(yuǎn)離繁瑣的配置。
提供了一系列大型項(xiàng)目通用的非業(yè)務(wù)性功能,例如:內(nèi)嵌服務(wù)器、安全管理、運(yùn)行數(shù)據(jù)監(jiān)控、運(yùn)行狀況檢查和外部化配置等。
絕對(duì)沒有代碼生成,也不需要XML配置。
3.Spring Boot 中的 starter 到底是什么 ?
首先,這個(gè) Starter 并非什么新的技術(shù)點(diǎn),基本上還是基于 Spring 已有功能來實(shí)現(xiàn)的。首先它提供了一個(gè)自動(dòng)化配置類,一般命名為 XXXAutoConfiguration
,在這個(gè)配置類中通過條件注解來決定一個(gè)配置是否生效(條件注解就是 Spring 中原本就有的),然后它還會(huì)提供一系列的默認(rèn)配置,也允許開發(fā)者根據(jù)實(shí)際情況自定義相關(guān)配置,然后通過類型安全的屬性注入將這些配置屬性注入進(jìn)來,新注入的屬性會(huì)代替掉默認(rèn)屬性。正因?yàn)槿绱?,很多第三方框架,我們只需要引入依賴就可以直接使用了?/p>
當(dāng)然,開發(fā)者也可以自定義 Starter,自定義 Starter 可以參考:徒手?jǐn)]一個(gè) Spring Boot 中的 Starter ,解密自動(dòng)化配置黑魔法!。
4.spring-boot-starter-parent 有什么用 ?
我們都知道,新創(chuàng)建一個(gè) Spring Boot 項(xiàng)目,默認(rèn)都是有 parent 的,這個(gè) parent 就是 spring-boot-starter-parent ,spring-boot-starter-parent 主要有如下作用:
定義了 Java 編譯版本為 1.8 。
使用 UTF-8 格式編碼。
繼承自 spring-boot-dependencies,這個(gè)里邊定義了依賴的版本,也正是因?yàn)槔^承了這個(gè)依賴,所以我們?cè)趯懸蕾嚂r(shí)才不需要寫版本號(hào)。
執(zhí)行打包操作的配置。
自動(dòng)化的資源過濾。
自動(dòng)化的插件配置。
針對(duì) application.properties 和 application.yml 的資源過濾,包括通過 profile 定義的不同環(huán)境的配置文件,例如 application-dev.properties 和 application-dev.yml。
關(guān)于這個(gè)問題,讀者可以參考:你真的理解 Spring Boot 項(xiàng)目中的 parent 嗎?
5.YAML 配置的優(yōu)勢(shì)在哪里 ?
YAML 現(xiàn)在可以算是非常流行的一種配置文件格式了,無論是前端還是后端,都可以見到 YAML 配置。那么 YAML 配置和傳統(tǒng)的 properties 配置相比到底有哪些優(yōu)勢(shì)呢?
配置有序,在一些特殊的場(chǎng)景下,配置有序很關(guān)鍵
支持?jǐn)?shù)組,數(shù)組中的元素可以是基本數(shù)據(jù)類型也可以是對(duì)象
簡潔
相比 properties 配置文件,YAML 還有一個(gè)缺點(diǎn),就是不支持 @PropertySource 注解導(dǎo)入自定義的 YAML 配置。
關(guān)于 YAML 配置,要是大家還不熟悉,可以參考: Spring Boot 中的 yaml 配置簡介
6.Spring Boot 中如何解決跨域問題 ?
跨域可以在前端通過 JSONP 來解決,但是 JSONP 只可以發(fā)送 GET 請(qǐng)求,無法發(fā)送其他類型的請(qǐng)求,在 RESTful 風(fēng)格的應(yīng)用中,就顯得非常雞肋,因此我們推薦在后端通過 (CORS,Cross-origin resource sharing) 來解決跨域問題。這種解決方案并非 Spring Boot 特有的,在傳統(tǒng)的 SSM 框架中,就可以通過 CORS 來解決跨域問題,只不過之前我們是在 XML 文件中配置 CORS ,現(xiàn)在則是通過 @CrossOrigin 注解來解決跨域問題。關(guān)于 CORS ,小伙伴們可以參考:Spring Boot 中通過 CORS 解決跨域問題
7.比較一下 Spring Security 和 Shiro 各自的優(yōu)缺點(diǎn) ?
由于 Spring Boot 官方提供了大量的非常方便的開箱即用的 Starter ,包括 Spring Security 的 Starter ,使得在 Spring Boot 中使用 Spring Security 變得更加容易,甚至只需要添加一個(gè)依賴就可以保護(hù)所有的接口,所以,如果是 Spring Boot 項(xiàng)目,一般選擇 Spring Security 。當(dāng)然這只是一個(gè)建議的組合,單純從技術(shù)上來說,無論怎么組合,都是沒有問題的。Shiro 和 Spring Security 相比,主要有如下一些特點(diǎn):
Spring Security 是一個(gè)重量級(jí)的安全管理框架;Shiro 則是一個(gè)輕量級(jí)的安全管理框架
Spring Security 概念復(fù)雜,配置繁瑣;Shiro 概念簡單、配置簡單
Spring Security 功能強(qiáng)大;Shiro 功能簡單
8.微服務(wù)中如何實(shí)現(xiàn) session 共享 ?
在微服務(wù)中,一個(gè)完整的項(xiàng)目被拆分成多個(gè)不相同的獨(dú)立的服務(wù),各個(gè)服務(wù)獨(dú)立部署在不同的服務(wù)器上,各自的 session 被從物理空間上隔離開了,但是經(jīng)常,我們需要在不同微服務(wù)之間共享 session ,常見的方案就是 Spring Session + Redis 來實(shí)現(xiàn) session 共享。將所有微服務(wù)的 session 統(tǒng)一保存在 Redis 上,當(dāng)各個(gè)微服務(wù)對(duì) session 有相關(guān)的讀寫操作時(shí),都去操作 Redis 上的 session 。這樣就實(shí)現(xiàn)了 session 共享,Spring Session 基于 Spring 中的代理過濾器實(shí)現(xiàn),使得 session 的同步操作對(duì)開發(fā)人員而言是透明的,非常簡便。 session 共享大家可以參考:Spring Boot 一個(gè)依賴搞定 session 共享,沒有比這更簡單的方案了!
9.Spring Boot 如何實(shí)現(xiàn)熱部署 ?
Spring Boot 實(shí)現(xiàn)熱部署其實(shí)很容易,引入 devtools 依賴即可,這樣當(dāng)編譯文件發(fā)生變化時(shí),Spring Boot 就會(huì)自動(dòng)重啟。在 Eclipse 中,用戶按下保存按鍵,就會(huì)自動(dòng)編譯進(jìn)而重啟 Spring Boot,IDEA 中由于是自動(dòng)保存的,自動(dòng)保存時(shí)并未編譯,所以需要開發(fā)者按下 Ctrl+F9 進(jìn)行編譯,編譯完成后,項(xiàng)目就自動(dòng)重啟了。
如果僅僅只是頁面模板發(fā)生變化,Java 類并未發(fā)生變化,此時(shí)可以不用重啟 Spring Boot,使用 LiveReload 插件就可以輕松實(shí)現(xiàn)熱部署。
10.Spring Boot 中如何實(shí)現(xiàn)定時(shí)任務(wù) ?
定時(shí)任務(wù)也是一個(gè)常見的需求,Spring Boot 中對(duì)于定時(shí)任務(wù)的支持主要還是來自 Spring 框架。
在 Spring Boot 中使用定時(shí)任務(wù)主要有兩種不同的方式,一個(gè)就是使用 Spring 中的 @Scheduled 注解,另一個(gè)則是使用第三方框架 Quartz。
使用 Spring 中的 @Scheduled 的方式主要通過 @Scheduled 注解來實(shí)現(xiàn)。
使用 Quartz ,則按照 Quartz 的方式,定義 Job 和 Trigger 即可。
關(guān)于定時(shí)任務(wù)這一塊,大家可以參考:Spring Boot 中實(shí)現(xiàn)定時(shí)任務(wù)的兩種方式!
11.前后端分離,如何維護(hù)接口文檔 ?
前后端分離開發(fā)日益流行,大部分情況下,我們都是通過 Spring Boot 做前后端分離開發(fā),前后端分離一定會(huì)有接口文檔,不然會(huì)前后端會(huì)深深陷入到扯皮中。一個(gè)比較笨的方法就是使用 word 或者 md 來維護(hù)接口文檔,但是效率太低,接口一變,所有人手上的文檔都得變。在 Spring Boot 中,這個(gè)問題常見的解決方案是 Swagger ,使用 Swagger 我們可以快速生成一個(gè)接口文檔網(wǎng)站,接口一旦發(fā)生變化,文檔就會(huì)自動(dòng)更新,所有開發(fā)工程師訪問這一個(gè)在線網(wǎng)站就可以獲取到最新的接口文檔,非常方便。關(guān)于 Swagger 的用法,大家可以參考:SpringBoot整合Swagger2,再也不用維護(hù)接口文檔了!
12.什么是 Spring Data ?
Spring Data 是 Spring 的一個(gè)子項(xiàng)目。用于簡化數(shù)據(jù)庫訪問,支持NoSQL 和 關(guān)系數(shù)據(jù)存儲(chǔ)。其主要目標(biāo)是使數(shù)據(jù)庫的訪問變得方便快捷。Spring Data 具有如下特點(diǎn):
SpringData 項(xiàng)目支持 NoSQL 存儲(chǔ):
MongoDB (文檔數(shù)據(jù)庫)
Neo4j(圖形數(shù)據(jù)庫)
Redis(鍵/值存儲(chǔ))
Hbase(列族數(shù)據(jù)庫)
SpringData 項(xiàng)目所支持的關(guān)系數(shù)據(jù)存儲(chǔ)技術(shù):
JDBC
JPA
Spring Data Jpa 致力于減少數(shù)據(jù)訪問層 (DAO) 的開發(fā)量. 開發(fā)者唯一要做的,就是聲明持久層的接口,其他都交給 Spring Data JPA 來幫你完成!Spring Data JPA 通過規(guī)范方法的名字,根據(jù)符合規(guī)范的名字來確定方法需要實(shí)現(xiàn)什么樣的邏輯。
13.Spring Boot 是否可以使用 XML 配置 ?
Spring Boot 推薦使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通過 @ImportResource 注解可以引入一個(gè) XML 配置。
14.Spring Boot 打成的 jar 和普通的 jar 有什么區(qū)別 ?
Spring Boot 項(xiàng)目最終打包成的 jar 是可執(zhí)行 jar ,這種 jar 可以直接通過 java-jar xxx.jar
命令來運(yùn)行,這種 jar 不可以作為普通的 jar 被其他項(xiàng)目依賴,即使依賴了也無法使用其中的類。
Spring Boot 的 jar 無法被其他項(xiàng)目依賴,主要還是他和普通 jar 的結(jié)構(gòu)不同。普通的 jar 包,解壓后直接就是包名,包里就是我們的代碼,而 Spring Boot 打包成的可執(zhí)行 jar 解壓后,在 \BOOT-INF\classes
目錄下才是我們的代碼,因此無法被直接引用。如果非要引用,可以在 pom.xml 文件中增加配置,將 Spring Boot 項(xiàng)目打包成兩個(gè) jar ,一個(gè)可執(zhí)行,一個(gè)可引用。
15.bootstrap.properties 和 application.properties 有何區(qū)別 ?
單純做 Spring Boot 開發(fā),可能不太容易遇到 bootstrap.properties 配置文件,但是在結(jié)合 Spring Cloud 時(shí),這個(gè)配置就會(huì)經(jīng)常遇到了,特別是在需要加載一些遠(yuǎn)程配置文件的時(shí)侯。
bootstrap.properties 在 application.properties 之前加載,配置在應(yīng)用程序上下文的引導(dǎo)階段生效。一般來說我們?cè)?Spring Cloud Config 或者 Nacos 中會(huì)用到它。bootstrap.properties 被 Spring ApplicationContext 的父類加載,這個(gè)類先于加載 application.properties 的 ApplicatonContext 啟動(dòng)。
當(dāng)然,前面敘述中的 properties 也可以修改為 yaml 。
聯(lián)系客服