本文將討論Spring Boot中最常見的30個面試問題。在當今就業市場中,這些問題出現的頻率呈上升趨勢並且有一些棘手。
首先共享我收集的學習資料: https://t00y.com/dir/22083442-36309434-5fe26a
算法資料: https://t00y.com/dir/22083442-36309437-14ea46
1、什麼是 Spring Boot?
Spring Boot 是 Spring 開源組織下的子項目,是 Spring 組件一站式解決方案,主要是簡化了使用 Spring 的難度,簡省了繁重的配置,提供了各種啓動器,開發者能快速上手。
更多 Spring Boot 詳細介紹請看這篇文章《什麼是Spring Boot?》。
2、爲什麼要用 Spring Boot?
Spring Boot 優點非常多,如:
- 獨立運行
- 簡化配置
- 自動配置
- 無代碼生成和XML配置
- 應用監控
- 上手容易
- ...
Spring Boot 集這麼多優點於一身,還有理由不使用它呢?
3、Spring Boot 的核心配置文件有哪幾個?它們的區別是什麼?
Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。
application 配置文件這個容易理解,主要用於 Spring Boot 項目的自動化配置。
bootstrap 配置文件有以下幾個應用場景。
- 使用 Spring Cloud Config 配置中心時,這時需要在 bootstrap 配置文件中添加連接到配置中心的配置屬性來加載外部配置中心的配置信息;
- 一些固定的不能被覆蓋的屬性;
- 一些加密/解密的場景;
具體請看這篇文章《Spring Boot 核心配置文件詳解》。
4、Spring Boot 的配置文件有哪幾種格式?它們有什麼區別?
.properties 和 .yml,它們的區別主要是書寫格式不同。
1).properties
app.user.name = javastack
2).yml
app:
user:
name: javastack
另外,.yml 格式不支持 @PropertySource
註解導入配置。
5、Spring Boot 的核心註解是哪個?它主要由哪幾個註解組成的?
啓動類上面的註解是@SpringBootApplication,它也是 Spring Boot 的核心註解,主要組合包含了以下 3 個註解:
@SpringBootConfiguration:組合了 @Configuration 註解,實現配置文件的功能。
@EnableAutoConfiguration:打開自動配置的功能,也可以關閉某個自動配置的選項,如關閉數據源自動配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
@ComponentScan:Spring組件掃描。
6、開啓 Spring Boot 特性有哪幾種方式?
1)繼承spring-boot-starter-parent項目
2)導入spring-boot-dependencies項目依賴
具體請參考這篇文章《Spring Boot開啓的2種方式》。
7、Spring Boot 需要獨立的容器運行嗎?
可以不需要,內置了 Tomcat/ Jetty 等容器。
8、運行 Spring Boot 有哪幾種方式?
1)打包用命令或者放到容器中運行
2)用 Maven/ Gradle 插件運行
3)直接執行 main 方法運行
9、Spring Boot 自動配置原理是什麼?
註解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自動配置的核心,首先它得是一個配置文件,其次根據類路徑下是否有這個類去自動配置。
具體看這篇文章《Spring Boot自動配置原理、實戰》。
10、Spring Boot 的目錄結構是怎樣的?
cn
+- javastack
+- MyApplication.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java
這個目錄結構是主流及推薦的做法,而在主入口類上加上 @SpringBootApplication 註解來開啓 Spring Boot 的各項能力,如自動配置、組件掃描等。具體看這篇文章《Spring Boot 主類及目錄結構介紹》。
11、你如何理解 Spring Boot 中的 Starters?
Starters可以理解爲啓動器,它包含了一系列可以集成到應用裏面的依賴包,你可以一站式集成 Spring 及其他技術,而不需要到處找示例代碼和依賴包。如你想使用 Spring JPA 訪問數據庫,只要加入 spring-boot-starter-data-jpa 啓動器依賴就能使用了。
Starters包含了許多項目中需要用到的依賴,它們能快速持續的運行,都是一系列得到支持的管理傳遞性依賴。具體請看這篇文章《Spring Boot Starters啓動器》。
12、如何在 Spring Boot 啓動的時候運行一些特定的代碼?
可以實現接口 ApplicationRunner 或者 CommandLineRunner,這兩個接口實現方式一樣,它們都只提供了一個 run 方法,具體請看這篇文章《Spring Boot Runner啓動器》。
13、Spring Boot 有哪幾種讀取配置的方式?
Spring Boot 可以通過 @PropertySource,@Value,@Environment, @ConfigurationProperties 來綁定變量,具體請看這篇文章《Spring Boot讀取配置的幾種方式》。
14、Spring Boot 支持哪些日誌框架?推薦和默認的日誌框架是哪個?
Spring Boot 支持 Java Util Logging, Log4j2, Lockback 作爲日誌框架,如果你使用 Starters 啓動器,Spring Boot 將使用 Logback 作爲默認日誌框架,具體請看這篇文章《Spring Boot日誌集成》。
15、SpringBoot 實現熱部署有哪幾種方式?
主要有兩種方式:
- Spring Loaded
- Spring-boot-devtools
Spring-boot-devtools 使用方式可以參考這篇文章《Spring Boot實現熱部署》。
16、你如何理解 Spring Boot 配置加載順序?
在 Spring Boot 裏面,可以使用以下幾種方式來加載配置。
1)properties文件;
2)YAML文件;
3)系統環境變量;
4)命令行參數;
等等……
具體請看這篇文章《Spring Boot 配置加載順序詳解》。
17、Spring Boot 如何定義多套不同環境配置?
提供多套配置文件,如:
applcation.properties
application-dev.properties
application-test.properties
application-prod.properties
運行時指定具體的配置文件,具體請看這篇文章《Spring Boot Profile 不同環境配置》。
18、Spring Boot 可以兼容老 Spring 項目嗎,如何做?
可以兼容,使用 @ImportResource
註解導入老 Spring 項目配置文件。
19、保護 Spring Boot 應用有哪些方法?
- 在生產中使用HTTPS
- 使用Snyk檢查你的依賴關係
- 升級到最新版本
- 啓用CSRF保護
- 使用內容安全策略防止XSS攻擊
- ...
更多請看這篇文章《10 種保護 Spring Boot 應用的絕佳方法》。
20、Spring Boot 2.X 有什麼新特性?與 1.X 有什麼區別?
- 配置變更
- JDK 版本升級
- 第三方類庫升級
- 響應式 Spring 編程支持
- HTTP/2 支持
- 配置屬性綁定
- 更多改進與加強...
21. @SpringBootApplication註釋在內部有什麼用處?
作爲Spring引導文檔,@SpringBootApplication註釋等同於同時使用@Configuration、@EnableAutoConfiguration和@ComponentScan及其默認屬性。Spring Boot允許開發人員使用單個註釋而不是多個註釋。但是,衆所周知,Spring提供了鬆散耦合的特性,我們可以根據項目需要爲每個註釋使用這些特性。
22. 如何在不使用BasePACKAGE過濾器的情況下排除程序包?
過濾程序包的方法不盡相同。但是彈簧啓動提供了一個更復雜的選項,可以在不接觸組件掃描的情況下實現這一點。在使用註釋@ SpringBootApplication時,可以使用排除屬性。請參閱下面的代碼片段:
@SpringBootApplication(exclude= {Employee.class})
public class FooAppConfiguration {}
23. 如何禁用特定的自動配置類?
若發現任何不願使用的特定自動配置類,可以使用@EnableAutoConfiguration的排除屬性。
//By using "exclude"
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
另一方面,如果類別不在類路徑上,則可以使用excludeName類註解,並且指定完全限定名。
//By using "excludeName"
@EnableAutoConfiguration(excludeName={Foo.class})
此外,Spring Boot還具有控制排除自動配置類列表的功能,可以通過使用spring.autoconfigure.exclude property來實現。可以將其添加到 propertie應用程序中,並且可以添加逗號分隔的多個類。
//By using property file
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
24. 什麼是Spring Actuator?它有什麼優勢?
這是Spring Boot中最常見的面試問題之一。根據Spring文件:
執行器是一個製造術語,指的是移動或控制某物的機械裝置。執行機構可以從一個小的變化中產生大量的運動。
衆所周知,Spring Boot提供了許多自動配置特性,幫助開發人員快速開發生產組件。但是,當考慮調試和如何調試,如果出現問題,總是需要分析日誌並挖掘應用程序的數據流,檢查問題出在何處。因此,Spring Actuator提供了方便的訪問這些類型的途徑。它提供了許多特性,例如創建了什麼樣的bean、控制器中的映射、CPU使用情況等等。它還可以將自動收集和審計健康狀況和指標應用到應用程序中。
它提供了一種非常簡單的方法來訪問少數生產就緒的REST端點,並從Web獲取各種信息。但是通過使用這些端點,你可以做很多事情來查看端點文檔。沒有必要擔心安全問題;如果存在Spring Security,則默認使用Spring Security的內容協商策略保護這些端點。或者,可以在RequestMatcher的幫助下配置自定義安全性。
25. 如何啓用/禁用執行器?
啓用/禁用致動器很容易;最簡單的方法是使特性能夠將依賴項(Maven/Gradle)添加到spring-boot-starter-actuator,即啓動器。如果不想啓用致動器,那麼就不要添加依賴項。
Maven依賴項:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
26. 什麼是Spring Initializer?
這個問題並不難,但面試官總是以此測試候選人的專業知識。
Spring Initializer是一個網絡應用程序,它可以生成一個Spring Boot項目,包含快速啓動所需的一切。和往常一樣,我們需要一個好的項目框架;它有助於你正確創建項目結構/框架。
27. 什麼是執行器停機?
關機是允許應用程序正常關機的端點。默認情況下,此功能不啓用。你可以在應用程序屬性文件中使用management . endpoint . shut down . enabled = true來啓用此選項。但是該方法請謹慎使用。
28. 是否可以在Spring boot中更改嵌入式Tomcat服務器的端口?
是的,更改端口是可行的。可以使用application.properties文件更改端口。但需要提到“server.port”(即server.port=8081)。確保項目類路徑中有application.properties;後續工作將由REST Spring框架接手。如果提到server.port=0,那麼它將自動分配任何可用的端口。
29. 是否可以在Spring Boot中覆蓋或替換嵌入式Tomcat?
是的,可以使用starter依賴項將嵌入式Tomcat替換爲任何其他服務器。可以根據需要使用SpringBootStarter Jetty或SpringBootStarter作爲每個項目的依賴項。
30. 可以在Spring Boot application中禁用默認的Web服務器嗎?
Spring的主要優勢是提供靈活性來構建鬆散耦合的應用程序。Spring提供了在快速配置中禁用網絡服務器的功能。可以使用應用程序屬性來配置網絡應用程序類型,例如 spring.main.web-application-type=none.