Spring Boot面試題


什么是 Spring Boot?

Spring Boot 是 Spring 開源組織下的子項目,是 Spring 組件一站式解決方案,主要是簡化了使用 Spring 的難度,約定大於配置,簡化了繁重的配置,提供了各種啟動器,開發者能快速上手。很容易就能創建一個獨立的,產品級別的應用。

背景:

J2EE笨重的開發、繁多的配置、低下的開發效率、復雜的部署流程、第三方技術集成難度大。

Spring Boot的優點:

  • 開箱即用,遠離繁瑣的配置。因為它無需配置XML,也無代碼生成器生成代碼,spring內置了非常多的 API, 只需要在配置文件中打開不同的開關即可觸發不同的自動配置類。所以它容易上手,能夠提升開發效率,為 Spring 開發提供一個更快、更廣泛的入門體驗。
  • 快速創建獨立運行的Spring項目以及與主流框架集成
  • 使用嵌入式的Servlet容器,應用無需打成WAR包,這樣可以更加輕松地開發和測試web應用程序。比如Tomcat就是一個Servlet容器,以前需要將項目打包成war包,放到tomcat中運行,現在可以不需要tomcat運行環境,僅需打包成一個Jar包,Jar包中內置了一個運行環境,使用Java -jar的命令就可以運行。
  • starters 自動依賴與默認版本控制,可以避免大量的 Maven 導入和各種版本沖突。
  • 提供了一系列大型項目通用的非業務性功能,例如:內嵌服務器、安全管理、運行數據監控、運行狀況檢查和外部化配置等。

Spring Boot 的核心注解是哪個?它主要由哪幾個注解組成的?

啟動類上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要組合包含了以下 3 個注解:

@SpringBootConfiguration:組合了 @Configuration 注解,實現配置文件的功能。

@EnableAutoConfiguration:打開自動配置的功能,也可以關閉某個自動配置的選項,如關閉數據源自動配置功能:@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。

@ComponentScan:Spring組件掃描。

Spring Boot 自動配置原理是什么?

注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自動配置的核心,@EnableAutoConfiguration 給容器導入META-INF/spring.factories 里定義的自動配置類。篩選有效的自動配置類。

Spring Boot中存現大量的 xxxAutoConfiguration 類,結合對應的 xxxProperties.java 讀取配置文件進行自動配置功能。我們在配置文件中打開相應的開關,Spring Boot就會將這個這個場景需要的所有組件都注冊到容器中,並配置好。

Spring Boot 有哪些配置加載方式?

在 Spring Boot 里面,可以使用以下幾種方式來加載配置。

1)properties文件;

2)YAML文件;

3)系統環境變量;

4)命令行參數;

等等……

什么是 YAML?

YAML 是一種人類可讀的數據序列化語言。它通常用於配置文件。與屬性文件相比,如果我們想要在配置文件中添加復雜的屬性,YAML 文件就更加結構化,而且更少混淆。可以看出 YAML 具有分層配置數據。

YAML 配置的優勢在哪里 ?

YAML 現在可以算是非常流行的一種配置文件格式了,無論是前端還是后端,都可以見到 YAML 配置。那么 YAML 配置和傳統的 properties 配置相比到底有哪些優勢呢?

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

相比 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(nacos是阿里巴巴開源的一款集服務發現+配置中心組件) 中會用到它。且 boostrap 里面的屬性不能被覆蓋;
  • application (. yml 或者 . properties): 由ApplicatonContext 加載,用於 spring boot 項目的自動化配置。

什么是 Spring Profiles?

Spring Profiles 允許用戶根據配置文件(dev,test,prod 等)來注冊 bean。因此,當應用程序在開發中運行時,只有某些 bean 可以加載,而在 PRODUCTION中,某些其他 bean 可以加載。假設我們的要求是 SwaggerOpenApi的前身,是一個書寫API文檔的規范)文檔僅適用於 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 相比,主要有如下一些特點:

  1. Spring Security 是一個重量級的安全管理框架;Shiro 則是一個輕量級的安全管理框架
  2. Spring Security 概念復雜,配置繁瑣;Shiro 概念簡單、配置簡單
  3. Spring Security 功能強大;Shiro 功能簡單
注:Apache Shiro是一個強大且易用的Java安全框架,執行身份驗證、授權、密碼和會話管理

什么是 CSRF 攻擊?

跨站請求偽造(Cross-site request forgery,CSRF),是攻擊者通過一些技術手段欺騙用戶的瀏覽器去訪問一個自己曾經認證過的網站並執行一些操作(如發郵件,發消息,甚至財產操作如轉賬和購買商品)。由於瀏覽器曾經認證過,所以被訪問的網站會認為是真正的用戶操作而去執行。通俗的說就是攻擊者自己寫了一個網頁,在這個網頁的各個組件中都加了對某個銀行賬戶進行轉賬或者購物網站進行消費的請求腳本,這樣只要用戶進入攻擊者寫的網頁並點擊任何一個組件,如果用戶剛好在不久前訪問過組件中偽造的目標請求網站,這樣一旦這個組件被點擊,就會向目標網站發起一個請求,這個請求就會被成功的偽造,從而讓用戶損失一些錢財。

防范手段

1、 檢查 Referer 首部字段
Referer 首部字段位於 HTTP 報文中,用於標識請求來源的地址。服務器會檢查這個首部字段並要求請求來源的地址在同一個 域名下,可以極大的防止 CSRF 攻擊。
這種辦法簡單易行,工作量低,僅需要在關鍵訪問處增加一步校驗。但這種辦法也有其局限性,因其完全依賴瀏覽器 發送正確的 Referer 字段。雖然 HTTP 協議對此字段的內容有明確的規定,但並無法保證來訪的瀏覽器的具體實現, 亦無法保證瀏覽器沒有安全漏洞影響到此字段。並且也存在攻擊者攻擊某些瀏覽器,篡改其 Referer 字段的可能。
2、添加校驗 Token(Spring Security采用的方式)
在訪問敏感數據請求時,要求用戶瀏覽器提供不保存在 Cookie 中,並且攻擊者無法偽造的數據作為校驗。例如服務 器生成隨機數並附加在表單的hidden標簽中,並要求客戶端回傳這個隨機數。如果是異步請求,需要在頁面通過<meta>標簽把token傳遞給用來處理異步請求的 js 。
3、輸入驗證碼
因為 CSRF 攻擊是在用戶無意識的情況下發生的,所以要求用戶輸入驗證碼可以讓用戶知道自己正在做的操作

Spring Boot 中的監視器是什么

因為SpringBoot簡單配置即可使用,對底層封裝的比較嚴實,所以發現錯誤不太好找bug。所以我們需要監控項目的某些狀態信息來方便找bug。Spring Boot提供您的項目監控組件是 Spring Boot Actuator。     
    - Endpoints:監控應用的入口,Spring Boot內置很多端點, 通過@EndPoints()注解即可自定義端點
    - 監控方式:HTTP 或者 JMX
    - 訪問路徑:例如:"/actuator/health"
    - 注意事項:按需配置暴露的端點(一共20多個端點)、需要通過Spring Security對所有端點進行權限控制,只有管理員可以訪問,否則任何人都可以訪問底層的代碼,很不安全。
比如下面定義了一個id為 "database"的端點,用戶只要用 項目名+ /actuator/database即可訪問這個項目的數據庫連接轉態信息

什么是 Spring Data ?

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

SpringData 項目支持 NoSQL 存儲:

  1. MongoDB (文檔數據庫)
  2. Neo4j(圖形數據庫)
  3. Redis(鍵/值存儲)
  4. Hbase(列族數據庫)
  5. Elasticsearch

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

  1. JDBC
  2. JPA(Java Persistence API的簡稱,中文名Java持久層API)

Spring Data Jpa 致力於減少數據訪問層 (DAO) 的開發量. 開發者唯一要做的,就是聲明持久層的接口,其他都交給 Spring Data JPA 來幫你完成!Spring Data JPA 通過規范方法的名字,根據符合規范的名字來確定方法需要實現什么樣的邏輯。

什么是 Apache Kafka?

Apache Kafka 是一個分布式發布 - 訂閱消息系統。它是一個可擴展的,容錯的發布 - 訂閱消息系統,它使我們能夠構建分布式應用程序。這是一個 Apache 頂級項目。Kafka 適合離線和在線消息消費。

什么是 Swagger?你用 Spring Boot 實現了它嗎?

Swagger 廣泛用於可視化 API,使用 Swagger UI 為前端開發人員提供在線沙箱。Swagger 是用於生成 RESTful Web 服務的可視化表示的工具,規范和完整框架實現。它使文檔能夠以與服務器相同的速度更新。當通過 Swagger 正確定義時,消費者可以使用最少量的實現邏輯來理解遠程服務並與其進行交互。因此,Swagger消除了調用服務時的猜測。

注:

沙箱技術即是一bai個虛du擬系統程序,zhi允許你在沙盤環dao境中運行瀏覽器或其他zhuan程序,因此運行所產shu生的變化可以隨后刪除。它創造了一個類似沙盒的獨立作業環境,在其內部運行的程序並不能對硬盤產生永久性的影響。其為一個獨立的虛擬環境,可以用來測試不受信任的應用程序或上網行為。
沙箱是一種按照安全策略限制程序行為的執行環境。早期主要用於測試可疑軟件等,比如黑客們為了試用某種病毒或者不安全產品,往往可以將它們在沙箱環境中運行。

前后端分離,如何維護接口文檔 ?

前后端分離開發日益流行,大部分情況下,我們都是通過 Spring Boot 做前后端分離開發,前后端分離一定會有接口文檔,不然會前后端會深深陷入到扯皮中。一個比較笨的方法就是使用 word 或者 md 來維護接口文檔,但是效率太低,接口一變,所有人手上的文檔都得變。在 Spring Boot 中,這個問題常見的解決方案是 Swagger ,使用 Swagger 我們可以快速生成一個接口文檔網站,接口一旦發生變化,文檔就會自動更新,所有開發工程師訪問這一個在線網站就可以獲取到最新的接口文檔,非常方便。

Spring Boot 打成的 jar 和普通的 jar 有什么區別 ?

Spring Boot 項目最終打包成的 jar 是可執行 jar ,這種 jar 可以直接通過 java -jar xxx.jar 命令來在內置Servlet容器中運行,這種 jar 不可以作為普通的 jar 被其他項目依賴,即使依賴了也無法使用其中的類。

Spring Boot 的 jar 無法被其他項目依賴,主要還是他和普通 jar 的結構不同。普通的 jar 包,解壓后直接就是包名,包里就是我們的代碼,而 Spring Boot 打包成的可執行 jar 解壓后,在 \BOOT-INF\classes 目錄下才是我們的代碼,因此無法被直接引用。如果非要引用,可以在 pom.xml 文件中增加配置,將 Spring Boot 項目打包成兩個 jar ,一個可執行,一個可引用。

 

如何使用 Spring Boot 實現異常處理?

通過@ControllerAdvice、@ExceptionHandler、@ModelAttribute、@DataBinder 4個注解來統一處理控制器類拋出的所有異常。

@ControllerAdvice:用於修飾類,表示該類是Controller的全局配置類。

 在此類中,可以對Controller進行如下三種全局配置:異常處理方案、綁定數據方案、綁定參數方案。

 @ExceptionHandler(異常處理方案):用於修飾方法,該方法會在Controller出現異常后被調用,用於處理捕獲到的異常。
 @ModelAttribute(綁定數據方案):用於修飾方法,該方法會在Controller方法執行前被調用,用於為Model對象綁定參數。
 @DataBinder(綁定參數方案): 用於修飾方法,該方法會在Controller方法執行前被調用,用於綁定參數的轉換器。

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

在 Spring Boot 中使用定時任務主要有兩種不同的方式,一個就是使用 Spring 中的 @Scheduled 注解,這個注解使用的是ThreadPoolTaskScheduler來實現的。在需要定時執行的方法上加上 @Scheduled 注解來實現。編碼簡單。
另一個則是使用第三方框架 Quartz。實現過程中需要按照 Quartz 的方式,定義 Job 和 Trigger。編碼復雜。

其中@Scheduled方式在分布式環境中會有重復執行的問題,但是Quartz在分布式環境中沒問題,因為Quartz會創建專有數據庫,如果發現數據庫中有相同任務在執行會放棄執行當前任務,這樣任務就不會被重復執行。

參考:

Spring Boot面試題(2020最新版)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM