2021最新的Spring Boot面試專題(附答案)看完我必拿offer

史上最全Spring Boot面試題(含答案)看完就是Spring Boot專家!

一.Spring Boot、Spring MVC 和 Spring 有什麼區別?

SpringFrame

SpringFramework 最重要的特徵是依賴注入。所有 SpringModules 不是依賴注入就是 IOC 控制反轉。

當我們恰當的使用 DI 或者是 IOC 的時候,我們可以開發松耦合應用。松耦合應用的單元測試可以很容易的進行。

SpringMVC

Spring MVC 提供了一種分離式的方法來開發 Web 應用。通過運用像 DispatcherServelet,MoudlAndView 和 ViewResolver 等一些簡單的概念,開發 Web 應用將會變的非常簡單。

SpringBoot

Spring 和 SpringMVC 的問題在於需要配置大量的參數。

<prestyle="box-sizing: inherit; font-family: Menlo, Monaco, Consolas,&quot;Courier New&quot;, monospace; font-size: 13px; word-break: initial; word-wrap: initial; white-space: pre; overflow: auto; margin: 16px 0px 14px; padding: 14px 15px 12px; border-radius: 3px; border: none; display: block; line-height: 1.6; background: rgb(246, 246, 246); color: rgb(61, 70, 77); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><propertyname="prefix"><value>/WEB-INF/views/</value></property><propertyname="suffix"><value>.jsp</value></property></bean><mvc:resourcesmapping="/webjars/**"location="/webjars/"/>``

Spring Boot 通過一個自動配置和啓動的項來目解決這個問題。爲了更快的構建產品就緒應用程序,Spring Boot 提供了一些非功能性特徵。

二.什麼是自動配置?

Spring 和 SpringMVC 的問題在於需要配置大量的參數。

<prestyle="box-sizing: inherit; font-family: Menlo, Monaco, Consolas,&quot;Courier New&quot;, monospace; font-size: 13px; word-break: initial; word-wrap: initial; white-space: pre; overflow: auto; margin: 16px 0px 14px; padding: 14px 15px 12px; border-radius: 3px; border: none; display: block; line-height: 1.6; background: rgb(246, 246, 246); color: rgb(61, 70, 77); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><propertyname="prefix"><value>/WEB-INF/views/</value></property><propertyname="suffix"><value>.jsp</value></property></bean><mvc:resourcesmapping="/webjars/**"location="/webjars/"/></pre>

我們能否帶來更多的智能?當一個 MVC JAR 添加到應用程序中的時候,我們能否自動配置一些 beans?

Spring 查看(CLASSPATH 上可用的框架)已存在的應用程序的配置。在此基礎上,Spring Boot 提供了配置應用程序和框架所需要的基本配置。這就是自動配置。

三.什麼是 Spring Boot Stater ?

啓動器是一套方便的依賴沒描述符,它可以放在自己的程序中。你可以一站式的獲取你所需要的 Spring 和相關技術,而不需要依賴描述符的通過示例代碼搜索和複製黏貼的負載。

例如,如果你想使用 Sping 和 JPA 訪問數據庫,只需要你的項目包含 spring-boot-starter-data-jpa 依賴項,你就可以完美進行。

四.你能否舉一個例子來解釋更多 Staters 的內容?

讓我們來思考一個 Stater 的例子 -Spring Boot Stater Web。

如果你想開發一個 web 應用程序或者是公開 REST 服務的應用程序。Spring Boot Start Web 是首選。讓我們使用 Spring Initializr 創建一個 Spring Boot Start Web 的快速項目。

Spring Boot Start Web 的依賴項

<prestyle="box-sizing: inherit; font-family: Menlo, Monaco, Consolas,&quot;Courier New&quot;, monospace; font-size: 13px; word-break: initial; word-wrap: initial; white-space: pre; overflow: auto; margin: 16px 0px 14px; padding: 14px 15px 12px; border-radius: 3px; border: none; display: block; line-height: 1.6; background: rgb(246, 246, 246); color: rgb(61, 70, 77); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></pre>

下面的截圖是添加進我們應用程序的不同的依賴項

史上最全Spring Boot面試題(含答案)看完就是Spring Boot專家!

依賴項可以被分爲

Spring - core,beans,context,aop

Web MVC - (Spring MVC)

Jackson - for JSON Binding

Validation - Hibernate,Validation API

Enbedded Servlet Container - Tomcat

Logging - logback,slf4j

任何經典的 Web 應用程序都會使用所有這些依賴項。Spring Boot Starter Web 預先打包了這些依賴項。

作爲一個開發者,我不需要再擔心這些依賴項和它們的兼容版本。

五.Spring Boot 還提供了其它的哪些 Starter Project Options?

Spring Boot 也提供了其它的啓動器項目包括,包括用於開發特定類型應用程序的典型依賴項。

spring-boot-starter-web-services - SOAP Web Services

spring-boot-starter-web - Web 和 RESTful 應用程序

spring-boot-starter-test - 單元測試和集成測試

spring-boot-starter-jdbc - 傳統的 JDBC

spring-boot-starter-hateoas - 爲服務添加 HATEOAS 功能

spring-boot-starter-security - 使用 SpringSecurity 進行身份驗證和授權

spring-boot-starter-data-jpa - 帶有 Hibeernate 的 Spring Data JPA

spring-boot-starter-data-rest - 使用 Spring Data REST 公佈簡單的 REST 服務

六.Spring 是如何快速創建產品就緒應用程序的?

Spring Boot 致力於快速產品就緒應用程序。爲此,它提供了一些譬如高速緩存,日誌記錄,監控和嵌入式服務器等開箱即用的非功能性特徵。

spring-boot-starter-actuator - 使用一些如監控和跟蹤應用的高級功能

spring-boot-starter-undertow, spring-boot-starter-jetty, spring-boot-starter-tomcat - 選擇您的特定嵌入式 Servlet 容器

spring-boot-starter-logging - 使用 logback 進行日誌記錄

spring-boot-starter-cache - 啓用 Spring Framework 的緩存支持

Spring2 和 Spring5 所需要的最低 Java 版本是什麼?

Spring Boot 2.0 需要 Java8 或者更新的版本。Java6 和 Java7 已經不再支持。

七.創建一個 Spring Boot Project 的最簡單的方法是什麼?

Spring Initializr是啓動 Spring Boot Projects 的一個很好的工具。

史上最全Spring Boot面試題(含答案)看完就是Spring Boot專家!

就像上圖中所展示的一樣,我們需要做一下幾步:

登錄 Spring Initializr,按照以下方式進行選擇:

選擇 com.in28minutes.springboot 爲組

選擇 studet-services 爲組件

選擇下面的依賴項

Web

Actuator

DevTools

點擊生 GenerateProject

將項目導入 Eclipse。文件 - 導入 - 現有的 Maven 項目

八.Spring Initializr 是創建 Spring Boot Projects 的唯一方法嗎?

不是的。

Spring Initiatlizr 讓創建 Spring Boot 項目變的很容易,但是,你也可以通過設置一個 maven 項目並添加正確的依賴項來開始一個項目。

在我們的 Spring 課程中,我們使用兩種方法來創建項目。

第一種方法是 start.spring.io 。

另外一種方法是在項目的標題爲“Basic Web Application”處進行手動設置。

手動設置一個 maven 項目

這裏有幾個重要的步驟:

在 Eclipse 中,使用文件 - 新建 Maven 項目來創建一個新項目

添加依賴項。

添加 maven 插件。

添加 Spring Boot 應用程序類。

到這裏,準備工作已經做好!

九.爲什麼我們需要 spring-boot-maven-plugin?

spring-boot-maven-plugin 提供了一些像 jar 一樣打包或者運行應用程序的命令。

spring-boot:run 運行你的 SpringBooty 應用程序。

spring-boot:repackage 重新打包你的 jar 包或者是 war 包使其可執行

spring-boot:start 和 spring-boot:stop 管理 Spring Boot 應用程序的生命週期(也可以說是爲了集成測試)。

spring-boot:build-info 生成執行器可以使用的構造信息。

十.如何使用 SpringBoot 自動重裝我的應用程序?

使用 Spring Boot 開發工具。

把 Spring Boot 開發工具添加進入你的項目是簡單的。

把下面的依賴項添加至你的 Spring Boot Project pom.xml 中

<prestyle="box-sizing: inherit; font-family: Menlo, Monaco, Consolas,&quot;Courier New&quot;, monospace; font-size: 13px; word-break: initial; word-wrap: initial; white-space: pre; overflow: auto; margin: 16px 0px 14px; padding: 14px 15px 12px; border-radius: 3px; border: none; display: block; line-height: 1.6; background: rgb(246, 246, 246); color: rgb(61, 70, 77); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope></dependency></pre>

重啓應用程序,然後就可以了。

在我測試的時候,發現了 LiveReload 漏洞,如果你測試時也發現了,請一定要告訴我們。

十一.什麼是嵌入式服務器?我們爲什麼要使用嵌入式服務器呢?

思考一下在你的虛擬機上部署應用程序需要些什麼。

第一步: 安裝 Java

第二部: 安裝 Web 或者是應用程序的服務器(Tomat/Wbesphere/Weblogic 等等)

第三部: 部署應用程序 war 包

如果我們想簡化這些步驟,應該如何做呢?

讓我們來思考如何使服務器成爲應用程序的一部分?

你只需要一個安裝了 Java 的虛擬機,就可以直接在上面部署應用程序了,

是不是很爽?

這個想法是嵌入式服務器的起源。

當我們創建一個可以部署的應用程序的時候,我們將會把服務器(例如,tomcat)嵌入到可部署的服務器中。

例如,對於一個 Spring Boot 應用程序來說,你可以生成一個包含 Embedded Tomcat 的應用程序 jar。你就可以想運行正常 Java 應用程序一樣來運行 web 應用程序了。

嵌入式服務器就是我們的可執行單元包含服務器的二進制文件(例如,tomcat.jar)。

十二.如何在 Spring Boot 中添加通用的 JS 代碼?

在源文件夾下,創建一個名爲 static 的文件夾。然後,你可以把你的靜態的內容放在這裏面。

例如,myapp.js 的路徑是 resourcesstaticjsmyapp.js

你可以參考它在 jsp 中的使用方法

<prestyle="box-sizing: inherit; font-family: Menlo, Monaco, Consolas,&quot;Courier New&quot;, monospace; font-size: 13px; word-break: initial; word-wrap: initial; white-space: pre; overflow: auto; margin: 16px 0px 14px; padding: 14px 15px 12px; border-radius: 3px; border: none; display: block; line-height: 1.6; background: rgb(246, 246, 246); color: rgb(61, 70, 77); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><csriptsrc="/js/myapp.js"></script></pre>

錯誤:HAL browser gives me unauthorized error - Full authenticaition is required to access this resource.

該如何來修復這個錯誤呢?

{ "timestamp": 1488656019562, "status": 401, "error": "Unauthorized", "message": "Full authentication is required to access this resource.", "path": "/beans"}

兩種方法:

方法 1:關閉安全驗證

application.properties

<prestyle="box-sizing: inherit; font-family: Menlo, Monaco, Consolas,&quot;Courier New&quot;, monospace; font-size: 13px; word-break: initial; word-wrap: initial; white-space: pre; overflow: auto; margin: 16px 0px 14px; padding: 14px 15px 12px; border-radius: 3px; border: none; display: block; line-height: 1.6; background: rgb(246, 246, 246); color: rgb(61, 70, 77); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">management.security.enabled:FALSE</pre>

方法二:在日誌中搜索密碼並傳遞至請求標頭中

十三.什麼是 Spring Date?

Spring Data 的使命是在保證底層數據存儲特殊性的前提下,爲數據訪問提供一個熟悉的,一致性的,基於 Spring 的編程模型。這使得使用數據訪問技術,關係數據庫和非關係數據庫,map-reduce 框架以及基於雲的數據服務變得很容易。

爲了讓它更簡單一些,Spring Data 提供了不受底層數據源限制的 Abstractions 接口。

下面來舉一個例子

<pre style="box-sizing: inherit; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; word-break: initial; word-wrap: initial; white-space: pre; overflow: auto; margin: 16px 0px 14px; padding: 14px 15px 12px; border-radius: 3px; border: none; display: block; line-height: 1.6; background: rgb(246, 246, 246); color: rgb(61, 70, 77); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">interfaceTodoRepositoryextendsCrudRepository<Todo,Long>{</pre>

你可以定義一簡單的庫,用來插入,更新,刪除和檢索代辦事項,而不需要編寫大量的代碼。

十四.什麼是 Spring Data REST?

Spring Data TEST 可以用來發布關於 Spring 數據庫的 HATEOAS RESTful 資源。

下面是一個使用 JPA 的例子

<pre style="box-sizing: inherit; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; word-break: initial; word-wrap: initial; white-space: pre; overflow: auto; margin: 16px 0px 14px; padding: 14px 15px 12px; border-radius: 3px; border: none; display: block; line-height: 1.6; background: rgb(246, 246, 246); color: rgb(61, 70, 77); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">@RepositoryRestResource(collectionResourceRel="todos",path="todos")publicinterfaceTodoRepository extends PagingAndSortingRepository<Todo,Long>{</pre>

不需要寫太多代碼,我們可以發佈關於 Spring 數據庫的 RESTful API。

下面展示的是一些關於 TEST 服務器的例子

POST

URL:http://localhost:8080/todos

Use Header:Content-Type:Type:application/json

Request Content

代碼如下

{ "user": "Jill", "desc": "Learn Hibernate", "done": false}

響應內容

{ "user": "Jill", "desc": "Learn Hibernate", "done": false, "_links": {"self": { "href": "http://localhost:8080/todos/1"},"todo": { "href": "http://localhost:8080/todos/1"} }}

響應包含新創建資源的 href。

十五.path=”users”, collectionResourceRel=”users” 如何與 Spring Data Rest 一起使用?

<pre style="box-sizing: inherit; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; word-break: initial; word-wrap: initial; white-space: pre; overflow: auto; margin: 16px 0px 14px; padding: 14px 15px 12px; border-radius: 3px; border: none; display: block; line-height: 1.6; background: rgb(246, 246, 246); color: rgb(61, 70, 77); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">@RepositoryRestResource(collectionResourceRel="users",path="users")publicinterfaceUserRestRepository extendsPagingAndSortingRepository<User,Long></pre>

path- 這個資源要導出的路徑段。

collectionResourceRel- 生成指向集合資源的鏈接時使用的 rel 值。在生成 HATEOAS 鏈接時使用。

十六.當 Spring Boot 應用程序作爲 Java 應用程序運行時,後臺會發生什麼?

如果你使用 Eclipse IDE,Eclipse maven 插件確保依賴項或者類文件的改變一經添加,就會被編譯並在目標文件中準備好!在這之後,就和其它的 Java 應用程序一樣了。

當你啓動 java 應用程序的時候,spring boot 自動配置文件就會魔法般的啓用了。

當 Spring Boot 應用程序檢測到你正在開發一個 web 應用程序的時候,它就會啓動 tomcat。

十七.我們能否在 spring-boot-starter-web 中用 jetty 代替 tomcat?

在 spring-boot-starter-web 移除現有的依賴項,並把下面這些添加進去。

<prestyle="box-sizing: inherit; font-family: Menlo, Monaco, Consolas,&quot;Courier New&quot;, monospace; font-size: 13px; word-break: initial; word-wrap: initial; white-space: pre; overflow: auto; margin: 16px 0px 14px; padding: 14px 15px 12px; border-radius: 3px; border: none; display: block; line-height: 1.6; background: rgb(246, 246, 246); color: rgb(61, 70, 77); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId></dependency></pre>

十八.如何使用 Spring Boot 部署到不同的服務器?

你需要做下面兩個步驟:

在一個項目中生成一個 war 文件。

將它部署到你最喜歡的服務器(websphere 或者 Weblogic 或者 Tomcat and so on)。

第二步:取決於你的服務器。

十九.RequestMapping 和 GetMapping 的不同之處在哪裏?

RequestMapping 具有類屬性的,可以進行 GET,POST,PUT 或者其它的註釋中具有的請求方法。

GetMapping 是 GET 請求方法中的一個特例。它只是 ResquestMapping 的一個延伸,目的是爲了提高清晰度。

二十.爲什麼我們不建議在實際的應用程序中使用 Spring Data Rest?

我們認爲 Spring Data Rest 很適合快速原型製造!在大型應用程序中使用需要謹慎。

通過 Spring Data REST 你可以把你的數據實體作爲 RESTful 服務直接發佈。

當你設計 RESTful 服務器的時候,最佳實踐表明,你的接口應該考慮到兩件重要的事情:

你的模型範圍。

你的客戶。

通過 With Spring Data REST,你不需要再考慮這兩個方面,只需要作爲 TEST 服務發佈實體。

這就是爲什麼我們建議使用 Spring Data Rest 在快速原型構造上面,或者作爲項目的初始解決方法。對於完整演變項目來說,這並不是一個好的注意。

Spring Boot擴展面試題

二十一. 在 Spring Initializer 中,如何改變一個項目的包名字?

二十二. JPA 和 Hibernate 有哪些區別?

二十三. 業務邊界應該從哪一層開始?

二十四. 使用 Spring Boot 啓動連接到內存數據庫 H2 的 JPA 應用程序需要哪些依賴項?

二十五.如何不通過任何配置來選擇 Hibernate 作爲 JPA 的默認實現?

二十六.指定的數據庫連接信息在哪裏?它是如何知道自動連接至 H2 的?

二十七.我們如何連接一個像 MSSQL 或者 orcale 一樣的外部數據庫?

二十八.Spring Boot 配置的默認 H2 數據庫的名字是上面?爲什麼默認的數據庫名字是 testdb?

二十九. 如果 H2 不在類路徑裏面,會出現上面情況?

三十.你能否舉一個以 ReadOnly 爲事務管理的例子?

三十一.發佈 Spring Boot 用戶應用程序自定義配置的最好方法是什麼?

三十二. 配置文件的需求是什麼?

三十三. 如何使用配置文件通過 Spring Boot 配置特定環境的配置?

面試題整理

由於篇幅過長的原因,爲了不影響大家的閱讀效果,文中沒有給到所有的答案。我這裏以文件的形式整理好了,需要借閱的程序員朋友可以免費來領取。

面試文件獲取方式:

點擊這裏獲取文中資料哦

收集了還有你不知道的其它面試題(springboot、mybatis、併發、java中高級面試總結等)

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