1. 概述
自推出以來,Spring Boot一直是Spring生態系統中的關鍵角色。該項目憑藉其自動配置能力,極大地簡化了我們的開發工作。
在本教程中,我們將涵蓋與Spring Boot相關的常見問題,這些問題可能會在面試中出現。
2. 常見問題 (Questions)
以下是一些常見問題,希望能解答您的疑問:
-
Q: How do I reset my password?
- A: 要重置您的密碼,請點擊“忘記密碼”鏈接,按照頁面提示進行操作。
-
Q: What if I'm still having trouble logging in?
- A: 如果您仍然無法登錄,請聯繫我們的技術支持團隊,我們將竭誠為您提供幫助。
-
Q: Can I change my account settings?
- A: 當然可以。您可以通過訪問您的個人資料頁面,修改您的個人信息、安全設置等。
-
Q: Where can I find more help?
- A: 您可以在我們的幫助中心找到更多詳細的文檔和常見問題解答:[鏈接到幫助中心]
Q1. Spring Boot 是什麼以及它的主要功能是什麼?
Spring Boot 基本上是一個基於 Spring 框架的快速應用程序開發框架。憑藉其自動配置和嵌入式應用程序服務器支持,以及它所享有的廣泛文檔和社區支持,Spring Boot 已成為 Java 生態系統中當前最受歡迎的技術之一。
以下是一些主要功能:
- 啓動器 (Starters) – 一組依賴描述符,可以一次性包含相關的依賴項。
- 自動配置 (Auto-configuration) – 一種基於 classpath 上存在的依賴項自動配置應用程序的方法。
- Actuator – 提供生產就緒功能,例如監控。
- 安全性 (Security) – 提供身份驗證和授權。
- 日誌記錄 (Logging) – 在程序執行過程中在某些點記錄事件。
Q2. Spring 和 Spring Boot 之間的區別是什麼?
Spring 框架提供了多種功能,使 Web 應用程序的開發更加容易。這些功能包括依賴注入、數據綁定、面向切面編程、數據訪問等等。
隨着時間的推移,Spring 變得越來越複雜,應用程序所需的配置量也越來越大,這可能會讓人感到畏懼。這時,Spring Boot 就派上用場了——它讓配置 Spring 應用程序變得輕而易舉。
本質上,Spring 是無意見的,而 Spring Boot 則對平台和庫採用了一種有意見的方式,讓我們能夠快速上手。
以下是 Spring Boot 帶來的兩個最重要的優勢:
- 根據類路徑上找到的 Artifact 自動配置應用程序
- 提供生產環境中常見的非功能特性,例如安全或健康檢查
請查看我們的其他教程,瞭解純粹的 Spring 和 Spring Boot 之間的詳細比較。
Q3. 如何在 Maven 項目中設置 Spring Boot 應用程序?
我們可以將 Spring Boot 包含在 Maven 項目中,就像包含任何其他庫一樣。但是,最佳方法是繼承來自 spring-boot-starter-parent 項目,並聲明對 Spring Boot starters 的依賴。 這樣做可以讓我們的項目重用 Spring Boot 的默認設置。
繼承 spring-boot-starter-parent 項目非常簡單——我們只需要在 pom.xml 中指定一個 parent 元素:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.3</version>
</parent>我們可以從 spring-boot-starter-parent 的最新版本中找到它,該項目位於 Maven Central。
使用 starter 父項目很方便,但並非總是可行的。 比如,如果我們的公司要求所有項目都從標準 POM 中繼承,我們仍然可以使用自定義父項目來受益於 Spring Boot 的依賴管理。
Q4. Spring Initializr 是什麼?
Spring Initializr 是一種方便創建 Spring Boot 項目的方式。
我們可以前往 Spring Initializr 網站,選擇一個依賴管理工具(Maven 或 Gradle),一種語言(Java、Kotlin 或 Groovy),一種打包方案(Jar 或 War),版本和依賴項,然後下載項目。
它 創建一個骨架項目,從而節省了設置時間,使我們可以專注於添加業務邏輯。
即使我們使用 IDE(如 STS 或帶有 STS 插件的 Eclipse)的新項目嚮導來創建 Spring Boot 項目,它也在後台使用 Spring Initializr。
Q5. 現有哪些 Spring Boot Starter 可用?
每個 Starter 都是 Spring 技術棧的一站式解決方案。 隨後所需的其他依賴項會透射式地引入並以一致的方式進行管理。
所有 Starter 都在 org.springframework.boot 組下,它們的名稱以 spring-boot-starter- 開頭。 這種命名模式使得在與支持按名稱搜索依賴項的 IDE 協作時,輕鬆查找 Starter 變得容易。
在撰寫本文時,我們有超過 50 個 Starter 可供使用。 在這裏,我們將列出最常見的 Starter:
- spring-boot-starter:核心 Starter,包括自動配置支持、日誌記錄和 YAML
- spring-boot-starter-aop:用於使用 Spring AOP 和 AspectJ 進行面向切面編程
- spring-boot-starter-data-jpa:用於使用 Spring Data JPA 和 Hibernate
- spring-boot-starter-security:用於使用 Spring Security
- spring-boot-starter-test:用於測試 Spring Boot 應用程序
- spring-boot-starter-web:用於構建 Web 應用程序,包括使用 Spring MVC 的 RESTful 應用程序
要查看所有 Starter 的完整列表,請參閲 此倉庫。
要了解有關 Spring Boot Starter 的更多信息,請查看《Spring Boot Starter 簡介》。
Q6. 如何禁用特定自動配置?
如果想要禁用特定自動配置,可以使用 exclude 屬性,在 @EnableAutoConfiguration 註解中指定。
例如,以下代碼片段會中和 DataSourceAutoConfiguration:
// other annotations
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
public class MyConfiguration { }如果啓用了帶有 @SpringBootApplication 註解的自動配置,而該註解中包含 @EnableAutoConfiguration 作為元註解,我們就可以通過同名的屬性來禁用自動配置:
// other annotations
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class MyConfiguration { }我們還可以通過設置 spring.autoconfigure.exclude 環境屬性來禁用自動配置。此設置在 application.properties 文件中與之前的作用相同:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfigurationQ7. 如何註冊自定義自動配置?
要註冊一個自動配置類,必須在 META-INF/spring.factories 文件中,將該類的完全限定名列在 EnableAutoConfiguration 鍵下。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.baeldung.autoconfigure.CustomAutoConfiguration如果使用 Maven 構建項目,該文件應放置在 resources/META-INF 目錄下,這將在 打包 階段最終位於上述位置。
Q8. 如何指示自動配置在Bean存在時退避?
要指示自動配置類在Bean已存在時退避,我們可以使用 @ConditionalOnMissingBean 註解。
該註解最顯著的屬性包括:
- value – 用於檢查的Bean類型
- name – 用於檢查的Bean名稱
當該註解放置在裝飾了 @Bean 的方法上時,目標類型默認為方法的返回類型:
@Configuration
public class CustomConfiguration {
@Bean
@ConditionalOnMissingBean
public CustomService service() { ... }
}Q9. 如何使用 JAR 和 WAR 文件部署 Spring Boot Web 應用程序?
傳統上,我們將 Web 應用程序打包為 WAR 文件,然後將其部署到外部服務器。 這樣做允許我們在同一服務器上安排多個應用程序。 當 CPU 和內存資源稀缺時,這是一種節省資源的有效方法。
但情況已經改變了。 如今,計算機硬件價格相對較低,注意力已經轉向服務器配置。 在部署過程中對服務器配置出現任何小錯誤都可能導致災難性後果。
Spring 通過提供一個插件,即 spring-boot-maven-plugin,來解決這個問題,將 Web 應用程序打包為可執行的 JAR 文件。
要包含此插件,只需將 plugin 元素添加到 pom.xml 中:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>使用此插件後,執行打包階段將生成一個大的 JAR 包。該 JAR 包包含所有必要的依賴項,包括嵌入式服務器。因此,我們無需再擔心配置外部服務器。
我們可以像運行普通可執行 JAR 包一樣運行應用程序。
請注意,打包元素在 pom.xml 文件中必須設置為 jar 以構建 JAR 文件:
<packaging>jar</packaging>如果未包含此元素,則默認值為 jar。
要創建 WAR 文件,我們將 packaging 元素更改為 war。
<packaging>war</packaging>並且從打包文件中移除容器依賴項:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>在執行 Maven 的 打包 階段後,我們將會得到一個可部署的 WAR 文件。
Q10. 如何使用 Spring Boot 構建命令行應用程序?
就像任何其他 Java 程序一樣,Spring Boot 命令行應用程序必須包含一個 main 方法。
該方法作為入口點,通過調用 SpringApplication#run 方法來啓動應用程序:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class);
// other statements
}
}SpringApplication 類隨後啓動 Spring 容器並自動配置 Bean。
請注意,必須將配置類傳遞給 run 方法,以便作為主要的配置源。按照約定,此參數是入口類本身。
在調用 run 方法後,我們可以像常規程序一樣執行其他語句。
Q11. 外部配置可能來源有哪些?
Spring Boot 支持外部配置,允許我們在不同的環境中運行相同的應用程序。 我們可以使用屬性文件、YAML 文件、環境變量、系統屬性和命令行選項參數來指定配置屬性。
我們可以使用 @Value 註解、通過 @ConfigurationProperties 註解綁定的綁定對象,或 Environment 抽象類來訪問這些屬性。
Q12. 什麼是“鬆散綁定”?
鬆散綁定在 Spring Boot 中適用於配置屬性的類型安全綁定。
通過鬆散綁定,屬性的鍵不必與屬性名稱完全匹配。 這種環境屬性可以採用駝峯命名法(camelCase)、短橫線命名法(kebab-case)、蛇形命名法(snake_case),或使用大寫字母並用下劃線分隔單詞。
例如,如果一個帶有 @ConfigurationProperties 註解的 Bean 類中的屬性名稱為 myProp,則它可以綁定到以下任何一個環境屬性:myProp, my-prop, my_prop, 或 MY_PROP.
Q13. Spring Boot DevTools 的用途是什麼?
Spring Boot Developer Tools(或 DevTools)是一套旨在簡化開發流程的工具集。
為了包含這些開發期間的功能,只需將依賴項添加到 pom.xml 文件中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>spring-boot-devtools 模塊在應用程序以生產環境運行時會自動禁用。 此外,存檔的重新打包默認也會排除該模塊,從而不會對最終產品產生任何額外的開銷。
默認情況下,DevTools 會應用適合開發環境的屬性。 這些屬性禁用模板緩存、為 Web 組啓用調試日誌,等等。 這樣我們就無需設置任何屬性,從而實現了合理的開發時間配置。
使用 DevTools 的應用程序在類路徑上的文件發生更改時會重啓。 這是一個非常有用的功能,在開發過程中可以提供快速反饋,用於修改。
默認情況下,靜態資源,包括視圖模板,不會觸發重啓。 相反,資源更改會觸發瀏覽器刷新。 請注意,這隻能在瀏覽器中安裝 LiveReload 擴展以與 DevTools 內置的 LiveReload 服務器進行交互時才能發生。
有關此主題的更多信息,請參閲 Spring Boot DevTools 概述。
Q14. 如何編寫集成測試?
當運行 Spring 應用的集成測試時,必須有 ApplicationContext。
為了讓我們的工作更輕鬆,Spring Boot 提供了專門用於測試的註解——@SpringBootTest。這個註解會根據其 classes 屬性中指定的配置類創建一個 ApplicationContext。
如果 classes 屬性未設置,Spring Boot 會搜索包含測試的包,直到找到一個帶有 @SpringBootApplication 或 @SpringBootConfiguration 註解的類。
有關詳細説明,請查看我們在 Spring Boot 中測試的教程。
Q15. Spring Boot Actuator 的作用是什麼?
Spring Boot Actuator 使得 Spring Boot 應用具備生產環境所需的各項功能,本質上就是讓 Spring Boot 應用“上線”。這些功能允許我們監控和管理正在運行的應用程序。
將 Spring Boot Actuator 集成到項目中非常簡單。我們只需要在 pom.xml 文件中包含 spring-boot-starter-actuator starter 即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>Spring Boot Actuator 可以通過 HTTP 或 JMX 端點暴露運維信息。但大多數應用程序選擇 HTTP,其中端點的身份和 /actuator 前綴構成 URL 路徑。
以下是 Actuator 提供的一些最常用的內置端點:
- env 暴露環境屬性
- health 顯示應用程序健康信息
- httptrace 顯示 HTTP 跟蹤信息
- info 顯示任意應用程序信息
- metrics 顯示指標信息
- loggers 顯示和修改應用程序中日誌器的配置
- mappings 顯示所有 @RequestMapping 路徑的列表
請參閲我們的 Spring Boot Actuator 教程以獲取詳細説明。
Q16. 使用屬性文件還是 YAML 更適合配置 Spring Boot 項目?
YAML 在相對於屬性文件而言,提供了許多優勢:
- 更清晰、更易讀
- 非常適合層次化配置數據,也以更清晰、更易讀的格式表示
- 支持 map、list 和 scalar 類型
- 可以包含多個 profile 在同一個文件中(自 Spring Boot 2.4.0 版本起,屬性文件也支持此功能)
然而,由於其縮進規則,編寫 YAML 可能會有些困難且容易出錯。
有關詳細信息和工作示例,請參閲我們的 Spring YAML vs Properties 教程。
Q17. Spring Boot 提供哪些基本註釋?
Spring Boot 提供的主要註釋位於其 org.springframework.boot.autoconfigure 包及其子包中。
以下是一些基本註釋:
- @EnableAutoConfiguration – 用於使 Spring Boot 在類路徑上查找自動配置 Bean 並自動應用它們
- @SpringBootApplication – 用於指定 Boot 應用程序的主類。此註釋將 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 註解及其默認屬性結合在一起。
Spring Boot Annotations 提供對該主題的更多見解。
Q18. 如何更改 Spring Boot 中默認端口?
我們可以使用以下方法更改嵌入式 Spring Boot 服務器的默認端口:
- 使用屬性文件 – 可以在
<em >application.properties</em >(或<em >application.yml</em >) 文件中定義server.port` 屬性。 - 通過編程方式 – 在我們的主
<em >@SpringBootApplication</em >類中,我們可以通過在<em >SpringApplication</em >實例上設置server.port來實現。 - 使用命令行 – 當以 jar 文件運行應用程序時,我們可以將
server.port作為 Java 命令參數設置:
java -jar -Dserver.port=8081 myspringproject.jar
由於您沒有提供需要翻譯的內容,我無法進行翻譯。請您提供需要翻譯的英文內容,我將按照您提出的所有要求進行翻譯。
Q19. Spring Boot 支持哪些嵌入式服務器,以及如何更改默認設置?
截至當前日期,Spring MVC 支持 Tomcat、Jetty 和 Undertow。 Tomcat 是 Spring Boot 的 web 啓動器支持的默認應用程序服務器。
Spring WebFlux 支持 Reactor Netty、Tomcat、Jetty 和 Undertow, 其中 Reactor Netty 作為默認選項。
在 Spring MVC 中,要更改默認設置(例如更改為 Jetty),我們需要排除 Tomcat 並將 Jetty 添加到依賴項中。
<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>同樣,要將 WebFlux 的默認設置更改為 UnderTow,我們需要排除 Reactor Netty 並將 UnderTow 添加到依賴項中。
關於 Spring Boot 中嵌入式 Servlet 容器的比較,提供了更多關於我們可與 Spring MVC 配合使用的不同嵌入式服務器的詳細信息。
Q20. 我們為什麼需要 Spring 配置文件?
在為企業應用開發時,我們通常會處理多個環境,例如 Dev、QA 和 Prod。這些環境的配置屬性不同。
例如,我們可能使用嵌入式 H2 數據庫進行 Dev 開發,而 Prod 環境則可能使用專有的 Oracle 或 DB2。即使在不同環境中 DBMS 相同,URL 也會有很大差異。
為了簡化和清理這些配置,Spring 提供了配置文件(Profiles)的功能,以幫助將每個環境的配置分開。因此,與其通過編程方式維護這些配置,可以將屬性保存在單獨的文件中,例如 application-dev.properties 和 application-prod.properties。默認的 application.properties 通過 spring.profiles.active 屬性來指向當前激活的配置文件,從而選擇正確的配置。
Spring Profiles 提供了對這個主題的全面概述。
3. 結論
本文概述了在技術面試中可能出現的關於 Spring Boot 最關鍵的問題。
我們希望這些內容能幫助你找到理想的工作!