javascript
Spring Boot面试题(2020最新版)
轉載自??Spring Boot面試題(2020最新版)
概述
什么是 Spring Boot?
Spring Boot 是 Spring 開源組織下的子項目,是 Spring 組件一站式解決方案,主要是簡化了使用 Spring 的難度,簡省了繁重的配置,提供了各種啟動器,開發者能快速上手。
?
Spring Boot 有哪些優點?
Spring Boot 主要有如下優點:
?
容易上手,提升開發效率,為 Spring 開發提供一個更快、更廣泛的入門體驗。
開箱即用,遠離繁瑣的配置。
提供了一系列大型項目通用的非業務性功能,例如:內嵌服務器、安全管理、運行數據監控、運行狀況檢查和外部化配置等。
沒有代碼生成,也不需要XML配置。
避免大量的 Maven 導入和各種版本沖突。
?
Spring Boot 的核心注解是哪個?它主要由哪幾個注解組成的?
啟動類上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要組合包含了以下 3 個注解:
?
啟動類上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要組合包含了以下 3 個注解:
?
@SpringBootConfiguration:組合了 @Configuration 注解,實現配置文件的功能。
?
@EnableAutoConfiguration:打開自動配置的功能,也可以關閉某個自動配置的選項,如關閉數據源自動配置功能:@SpringBootApplication(exclude{DataSourceAutoConfiguration.class})
@ComponentScan:Spring組件掃描。
?
配置
什么是 JavaConfig?
Spring JavaConfig 是 Spring 社區的產品,它提供了配置 Spring IoC 容器的純Java 方法。因此它有助于避免使用 XML 配置。使用 JavaConfig 的優點在于:
?
(1)面向對象的配置。由于配置被定義為 JavaConfig 中的類,因此用戶可以充分利用 Java 中的面向對象功能。一個配置類可以繼承另一個,重寫它的@Bean 方法等。
?
(2)減少或消除 XML 配置。基于依賴注入原則的外化配置的好處已被證明。但是,許多開發人員不希望在 XML 和 Java 之間來回切換。JavaConfig 為開發人員提供了一種純 Java 方法來配置與 XML 配置概念相似的 Spring 容器。從技術角度來講,只使用 JavaConfig 配置類來配置容器是可行的,但實際上很多人認為將JavaConfig 與 XML 混合匹配是理想的。
?
(3)類型安全和重構友好。JavaConfig 提供了一種類型安全的方法來配置 Spring容器。由于 Java 5.0 對泛型的支持,現在可以按類型而不是按名稱檢索 bean,不需要任何強制轉換或基于字符串的查找。
Spring Boot 自動配置原理是什么?
注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自動配置的核心,
@EnableAutoConfiguration 給容器導入META-INF/spring.factories 里定義的自動配置類。
篩選有效的自動配置類。
每一個自動配置類結合對應的 xxxProperties.java 讀取配置文件進行自動配置功能
?
你如何理解 Spring Boot 配置加載順序?
在 Spring Boot 里面,可以使用以下幾種方式來加載配置。
1)properties文件;
2)YAML文件;
3)系統環境變量;
4)命令行參數;
等等……
什么是 YAML?
YAML 是一種人類可讀的數據序列化語言。它通常用于配置文件。與屬性文件相比,如果我們想要在配置文件中添加復雜的屬性,YAML 文件就更加結構化,而且更少混淆。可以看出 YAML 具有分層配置數據。
YAML 配置的優勢在哪里 ?
YAML 現在可以算是非常流行的一種配置文件格式了,無論是前端還是后端,都可以見到 YAML 配置。那么 YAML 配置和傳統的 properties 配置相比到底有哪些優勢呢?
?
配置有序,在一些特殊的場景下,配置有序很關鍵
支持數組,數組中的元素可以是基本數據類型也可以是對象
簡潔
相比 properties 配置文件,YAML 還有一個缺點,就是不支持@PropertySource 注解導入自定義的 YAML 配置。
Spring Boot 是否可以使用 XML 配置 ?
Spring Boot 推薦使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通過 @ImportResource 注解可以引入一個 XML 配置。
spring boot 核心配置文件是什么?bootstrap.properties 和 application.properties 有何區別 ?
單純做 Spring Boot 開發,可能不太容易遇到 bootstrap.properties 配置文件,但是在結合 Spring Cloud 時,這個配置就會經常遇到了,特別是在需要加載一些遠程配置文件的時侯。
spring boot 核心的兩個配置文件:
?
-
bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加載的,比 applicaton 優先加載,配置在應用程序上下文的引導階段生效。一般來說我們在 Spring Cloud Config 或者 Nacos 中會用到它。且 boostrap 里面的屬性不能被覆蓋;
-
application (. yml 或者 . properties):由ApplicatonContext 加載,用于 spring boot 項目的自動化配置。
?
什么是 Spring Profiles?
Spring Profiles 允許用戶根據配置文件(dev,test,prod 等)來注冊 bean。因此,當應用程序在開發中運行時,只有某些 bean 可以加載,而在 PRODUCTION中,某些其他 bean 可以加載。假設我們的要求是 Swagger 文檔僅適用于 QA 環境,并且禁用所有其他文檔。這可以使用配置文件來完成。Spring Boot 使得使用配置文件非常簡單。
?
如何在自定義端口上運行 Spring Boot 應用程序?
為了在自定義端口上運行 Spring Boot 應用程序,您可以在application.properties 中指定端口。server.port = 8090
安全
如何實現 Spring Boot 應用程序的安全性?
為了實現 Spring Boot 的安全性,我們使用 spring-boot-starter-security 依賴項,并且必須添加安全配置。它只需要很少的代碼。配置類將必須擴展WebSecurityConfigurerAdapter 并覆蓋其方法。
比較一下 Spring Security 和 Shiro 各自的優缺點 ?
由于 Spring Boot 官方提供了大量的非常方便的開箱即用的 Starter ,包括 Spring Security 的 Starter ,使得在 Spring Boot 中使用 Spring Security 變得更加容易,甚至只需要添加一個依賴就可以保護所有的接口,所以,如果是 Spring Boot 項目,一般選擇 Spring Security 。當然這只是一個建議的組合,單純從技術上來說,無論怎么組合,都是沒有問題的。Shiro 和 Spring Security 相比,主要有如下一些特點:
Spring Security 是一個重量級的安全管理框架;Shiro 則是一個輕量級的安全管理框架
Spring Security 概念復雜,配置繁瑣;Shiro 概念簡單、配置簡單
Spring Security 功能強大;Shiro 功能簡單
Spring Boot 中如何解決跨域問題 ?
跨域可以在前端通過 JSONP 來解決,但是 JSONP 只可以發送 GET 請求,無法發送其他類型的請求,在 RESTful 風格的應用中,就顯得非常雞肋,因此我們推薦在后端通過 (CORS,Cross-origin resource sharing) 來解決跨域問題。這種解決方案并非 Spring Boot 特有的,在傳統的 SSM 框架中,就可以通過 CORS 來解決跨域問題,只不過之前我們是在 XML 文件中配置 CORS ,現在可以通過實現WebMvcConfigurer接口然后重寫addCorsMappings方法解決跨域問題。
?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
項目中前后端分離部署,所以需要解決跨域的問題。
我們使用cookie存放用戶登錄的信息,在spring攔截器進行權限控制,當權限不符合時,直接返回給用戶固定的json結果。
當用戶登錄以后,正常使用;當用戶退出登錄狀態時或者token過期時,由于攔截器和跨域的順序有問題,出現了跨域的現象。
我們知道一個http請求,先走filter,到達servlet后才進行攔截器的處理,如果我們把cors放在filter里,就可以優先于權限攔截器執行。
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
什么是 CSRF 攻擊?
CSRF 代表跨站請求偽造。這是一種攻擊,迫使最終用戶在當前通過身份驗證的Web 應用程序上執行不需要的操作。CSRF 攻擊專門針對狀態改變請求,而不是數據竊取,因為攻擊者無法查看對偽造請求的響應。
監視器
Spring Boot 中的監視器是什么?
Spring boot actuator 是 spring 啟動框架中的重要功能之一。Spring boot 監視器可幫助您訪問生產環境中正在運行的應用程序的當前狀態。有幾個指標必須在生產環境中進行檢查和監控。即使一些外部應用程序可能正在使用這些服務來向相關人員觸發警報消息。監視器模塊公開了一組可直接作為 HTTP URL 訪問的REST 端點來檢查狀態。
?
如何在 Spring Boot 中禁用 Actuator 端點安全性?
默認情況下,所有敏感的 HTTP 端點都是安全的,只有具有 ACTUATOR 角色的用戶才能訪問它們。安全性是使用標準的 HttpServletRequest.isUserInRole 方法實施的。我們可以使用來禁用安全性。只有在執行機構端點在防火墻后訪問時,才建議禁用安全性。
?
我們如何監視所有 Spring Boot 微服務?
Spring Boot 提供監視器端點以監控各個微服務的度量。這些端點對于獲取有關應用程序的信息(如它們是否已啟動)以及它們的組件(如數據庫等)是否正常運行很有幫助。但是,使用監視器的一個主要缺點或困難是,我們必須單獨打開應用程序的知識點以了解其狀態或健康狀況。想象一下涉及 50 個應用程序的微服務,管理員將不得不擊中所有 50 個應用程序的執行終端。為了幫助我們處理這種情況,我們將使用位于的開源項目。它建立在 Spring Boot Actuator 之上,它提供了一個 Web UI,使我們能夠可視化多個應用程序的度量。
?
整合第三方項目
什么是 WebSockets?
WebSocket 是一種計算機通信協議,通過單個 TCP 連接提供全雙工通信信道。
?
1、WebSocket 是雙向的 -使用 WebSocket 客戶端或服務器可以發起消息發送。
?
2、WebSocket 是全雙工的 -客戶端和服務器通信是相互獨立的。
?
3、單個 TCP 連接 -初始連接使用 HTTP,然后將此連接升級到基于套接字的連接。然后這個單一連接用于所有未來的通信
?
4、Light -與 http 相比,WebSocket 消息數據交換要輕得多。
什么是 Spring Data ?
Spring Data 是 Spring 的一個子項目。用于簡化數據庫訪問,支持NoSQL 和 關系數據存儲。其主要目標是使數據庫的訪問變得方便快捷。Spring Data 具有如下特點:
SpringData 項目支持 NoSQL 存儲:
MongoDB (文檔數據庫)
Neo4j(圖形數據庫)
Redis(鍵/值存儲)
Hbase(列族數據庫)
SpringData 項目所支持的關系數據存儲技術:
JDBC
JPA
Spring Data Jpa 致力于減少數據訪問層 (DAO) 的開發量. 開發者唯一要做的,就是聲明持久層的接口,其他都交給 Spring Data JPA 來幫你完成!Spring Data JPA 通過規范方法的名字,根據符合規范的名字來確定方法需要實現什么樣的邏輯。
?
什么是 Spring Batch?
Spring Boot Batch 提供可重用的函數,這些函數在處理大量記錄時非常重要,包括日志/跟蹤,事務管理,作業處理統計信息,作業重新啟動,跳過和資源管理。它還提供了更先進的技術服務和功能,通過優化和分區技術,可以實現極高批量和高性能批處理作業。簡單以及復雜的大批量批處理作業可以高度可擴展的方式利用框架處理重要大量的信息。
?
什么是 FreeMarker 模板?
FreeMarker 是一個基于 Java 的模板引擎,最初專注于使用 MVC 軟件架構進行動態網頁生成。使用 Freemarker 的主要優點是表示層和業務層的完全分離。程序員可以處理應用程序代碼,而設計人員可以處理 html 頁面設計。最后使用freemarker 可以將這些結合起來,給出最終的輸出頁面。
?
如何集成 Spring Boot 和 ActiveMQ?
對于集成 Spring Boot 和 ActiveMQ,我們使用依賴關系。它只需要很少的配置,并且不需要樣板代碼。
什么是 Apache Kafka?
Apache Kafka 是一個分布式發布 - 訂閱消息系統。它是一個可擴展的,容錯的發布 - 訂閱消息系統,它使我們能夠構建分布式應用程序。這是一個 Apache 頂級項目。Kafka 適合離線和在線消息消費。
什么是 Swagger?你用 Spring Boot 實現了它嗎?
Swagger 廣泛用于可視化 API,使用 Swagger UI 為前端開發人員提供在線沙箱。Swagger 是用于生成 RESTful Web 服務的可視化表示的工具,規范和完整框架實現。它使文檔能夠以與服務器相同的速度更新。當通過 Swagger 正確定義時,消費者可以使用最少量的實現邏輯來理解遠程服務并與其進行交互。因此,Swagger消除了調用服務時的猜測。
前后端分離,如何維護接口文檔 ?
前后端分離開發日益流行,大部分情況下,我們都是通過 Spring Boot 做前后端分離開發,前后端分離一定會有接口文檔,不然會前后端會深深陷入到扯皮中。一個比較笨的方法就是使用 word 或者 md 來維護接口文檔,但是效率太低,接口一變,所有人手上的文檔都得變。在 Spring Boot 中,這個問題常見的解決方案是 Swagger ,使用 Swagger 我們可以快速生成一個接口文檔網站,接口一旦發生變化,文檔就會自動更新,所有開發工程師訪問這一個在線網站就可以獲取到最新的接口文檔,非常方便。
?
其他
如何重新加載 Spring Boot 上的更改,而無需重新啟動服務器?Spring Boot項目如何熱部署?
這可以使用 DEV 工具來實現。通過這種依賴關系,您可以節省任何更改,嵌入式tomcat 將重新啟動。Spring Boot 有一個開發工具(DevTools)模塊,它有助于提高開發人員的生產力。Java 開發人員面臨的一個主要挑戰是將文件更改自動部署到服務器并自動重啟服務器。開發人員可以重新加載 Spring Boot 上的更改,而無需重新啟動服務器。這將消除每次手動部署更改的需要。Spring Boot 在發布它的第一個版本時沒有這個功能。這是開發人員最需要的功能。DevTools 模塊完全滿足開發人員的需求。該模塊將在生產環境中被禁用。它還提供 H2 數據庫控制臺以更好地測試應用程序。
?
- ?
- ?
- ?
- ?
您使用了哪些 starter maven 依賴項?
使用了下面的一些依賴項
spring-boot-starter-activemq
spring-boot-starter-security
這有助于增加更少的依賴關系,并減少版本的沖突。
Spring Boot 中的 starter 到底是什么 ?
首先,這個 Starter 并非什么新的技術點,基本上還是基于 Spring 已有功能來實現的。首先它提供了一個自動化配置類,一般命名為 XXXAutoConfiguration ,在這個配置類中通過條件注解來決定一個配置是否生效(條件注解就是 Spring 中原本就有的),然后它還會提供一系列的默認配置,也允許開發者根據實際情況自定義相關配置,然后通過類型安全的屬性注入將這些配置屬性注入進來,新注入的屬性會代替掉默認屬性。正因為如此,很多第三方框架,我們只需要引入依賴就可以直接使用了。當然,開發者也可以自定義 Starter
?
spring-boot-starter-parent 有什么用 ?
我們都知道,新創建一個 Spring Boot 項目,默認都是有 parent 的,這個 parent 就是 spring-boot-starter-parent ,spring-boot-starter-parent 主要有如下作用:
?
定義了 Java 編譯版本為 1.8 。
使用 UTF-8 格式編碼。
繼承自 spring-boot-dependencies,這個里邊定義了依賴的版本,也正是因為繼承了這個依賴,所以我們在寫依賴時才不需要寫版本號。
執行打包操作的配置。
自動化的資源過濾。
自動化的插件配置。
針對 application.properties 和 application.yml 的資源過濾,包括通過 profile 定義的不同環境的配置文件,例如 application-dev.properties 和 application-dev.yml。
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 ,一個可執行,一個可引用。
?
運行 Spring Boot 有哪幾種方式?
1)打包用命令或者放到容器中運行
2)用 Maven/ Gradle 插件運行
3)直接執行 main 方法運行
Spring Boot 需要獨立的容器運行嗎?
可以不需要,內置了 Tomcat/ Jetty 等容器。
開啟 Spring Boot 特性有哪幾種方式?
1)繼承spring-boot-starter-parent項目
2)導入spring-boot-dependencies項目依賴
如何使用 Spring Boot 實現異常處理?
Spring 提供了一種使用 ControllerAdvice 處理異常的非常有用的方法。我們通過實現一個 ControlerAdvice 類,來處理控制器類拋出的所有異常。
如何使用 Spring Boot 實現分頁和排序?
使用 Spring Boot 實現分頁非常簡單。使用 Spring Data-JPA 可以實現將可分頁的傳遞給存儲庫方法。
微服務中如何實現 session 共享 ?
在微服務中,一個完整的項目被拆分成多個不相同的獨立的服務,各個服務獨立部署在不同的服務器上,各自的 session 被從物理空間上隔離開了,但是經常,我們需要在不同微服務之間共享 session ,常見的方案就是 Spring Session + Redis 來實現 session 共享。將所有微服務的 session 統一保存在 Redis 上,當各個微服務對 session 有相關的讀寫操作時,都去操作 Redis 上的 session 。這樣就實現了 session 共享,Spring Session 基于 Spring 中的代理過濾器實現,使得 session 的同步操作對開發人員而言是透明的,非常簡便。
?
Spring Boot 中如何實現定時任務 ?
定時任務也是一個常見的需求,Spring Boot 中對于定時任務的支持主要還是來自 Spring 框架。
在 Spring Boot 中使用定時任務主要有兩種不同的方式,一個就是使用 Spring 中的 @Scheduled 注解,另一個則是使用第三方框架 Quartz。
使用 Spring 中的 @Scheduled 的方式主要通過 @Scheduled 注解來實現。
使用 Quartz ,則按照 Quartz 的方式,定義 Job 和 Trigger 即可。
原文地址:https://blog.csdn.net/ThinkWon/article/details/104397299
作者:ThinkWon?
面試專場:
Redis面試題(2020最新版)
Tomcat面試題(2020最新版)
Java虛擬機(JVM)面試題(2020最新版)
Spring Cloud面試題(2020最新版)
MySQL數據庫面試題(2020最新版)
消息中間件MQ與RabbitMQ面試題(2020最新版)
Java并發編程面試題(2020最新版)
Netty面試題(2020最新版)
Zookeeper超詳細的面試題
Java經典面試題整理及答案詳解(一)
面試官問:為什么需要消息隊列?使用消息隊列有什么好處?
BAT大廠招聘Java 程序員的技術標準,你達到要求了嗎?
別再說你不會分布式了,面試官能問的都在這了
Spring MVC 面經
Java面試----2018年MyBatis常見實用面試題整理
《圖解HTTP》面試知道這些就差不多了!
Spring經典面試題總結
面試:史上最全多線程面試題 !
總結
以上是生活随笔為你收集整理的Spring Boot面试题(2020最新版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《战地风云 2042》Steam 在线峰
- 下一篇: 华为完成 5G-A 通感验证,首测微形变