Spring Boot面試題

1、什麼是 Spring Boot?

多年來,隨着新功能的增加,spring 變得越來越複雜。訪問spring官網頁面,我們就會看到可以在我們的應用程序中使用的所有 Spring 項目的不同功能。如果必須啓動一個新的 Spring 項目,我們必須添加構建路徑或添加 Maven 依賴關係,配置應用程序服務器,添加 spring 配置。因此,開始一個新的 spring 項目需要很多努力,因爲我們現在必須從頭開始做所有事情。

Spring Boot 是解決這個問題的方法。Spring Boot 已經建立在現有 spring 框架之上。使用 spring 啓動,我們避免了之前我們必須做的所有樣板代碼和配置。因此,Spring Boot 可以幫助我們以最少的工作量,更加健壯地使用現有的 Spring功能。
2、Spring Boot 有哪些優點?

Spring Boot 的優點有:

1、減少開發,測試時間和努力。

2、使用 JavaConfig 有助於避免使用 XML。

3、避免大量的 Maven 導入和各種版本衝突。

4、提供意見發展方法。

5、通過提供默認值快速開始開發。

6、沒有單獨的 Web 服務器需要。這意味着你不再需要啓動 Tomcat,Glassfish或其他任何東西。

7、需要更少的配置 因爲沒有 web.xml 文件。只需添加用@ Configuration 註釋的類,然後添加用@Bean 註釋的方法,Spring 將自動加載對象並像以前一樣對其進行管理。您甚至可以將@Autowired 添加到 bean 方法中,以使 Spring 自動裝入需要的依賴關係中。

8、基於環境的配置 使用這些屬性,您可以將您正在使用的環境傳遞到應用程序:-Dspring.profiles.active = {enviornment}。在加載主應用程序屬性文件後,Spring 將在(application{environment} .properties)中加載後續的應用程序屬性文件。
3、Spring 和 SpringBoot 有什麼不同?

Spring 框架提供多種特性使得 web 應用開發變得更簡便,包括依賴注入、數據綁定、切面編程、數據存取等等。

隨着時間推移,Spring 生態變得越來越複雜了,並且應用程序所必須的配置文件也令人覺得可怕。這就是 Spirng Boot 派上用場的地方了 – 它使得 Spring 的配置變得更輕而易舉。

實際上,Spring 是 unopinionated(予以配置項多,傾向性弱) 的,Spring Boot 在平臺和庫的做法中更 opinionated ,使得我們更容易上手。

這裏有兩條 SpringBoot 帶來的好處:

根據 classpath 中的 artifacts 的自動化配置應用程序
提供非功能性特性例如安全和健康檢查給到生產環境中的應用程序

4、如何重新加載 Spring Boot 上的更改,而無需重新啓動服務器?

這可以使用 DEV 工具來實現。通過這種依賴關係,您可以節省任何更改,嵌入式tomcat 將重新啓動。Spring Boot 有一個開發工具(DevTools)模塊,它有助於提高開發人員的生產力。Java 開發人員面臨的一個主要挑戰是將文件更改自動部署到服務器並自動重啓服務器。開發人員可以重新加載 Spring Boot 上的更改,而無需重新啓動服務器。這將消除每次手動部署更改的需要。Spring Boot 在發佈它的第一個版本時沒有這個功能。這是開發人員最需要的功能。DevTools 模塊完全滿足開發人員的需求。該模塊將在生產環境中被禁用。它還提供 H2 數據庫控制檯以更好地測試應用程序。

org.springframework.boot spring-boot-devtools true

5、Spring Boot 中的監視器是什麼?

Spring boot actuator 是 spring 啓動框架中的重要功能之一。Spring boot 監視器可幫助您訪問生產環境中正在運行的應用程序的當前狀態。有幾個指標必須在生產環境中進行檢查和監控。即使一些外部應用程序可能正在使用這些服務來向相關人員觸發警報消息。監視器模塊公開了一組可直接作爲 HTTP URL 訪問的REST 端點來檢查狀態。
6、如何在 Spring Boot 中禁用 Actuator 端點安全性?

默認情況下,所有敏感的 HTTP 端點都是安全的,只有具有 ACTUATOR 角色的用戶才能訪問它們。安全性是使用標準的 HttpServletRequest.isUserInRole 方法實施的。 我們可以使用來禁用安全性。只有在執行機構端點在防火牆後訪問時,才建議禁用安全性。
7、如何在自定義端口上運行 Spring Boot 應用程序?

爲了在自定義端口上運行 Spring Boot 應用程序,您可以在application.properties 中指定端口。server.port = 8090
8、怎麼使用 Maven 來構建一個 SpringBoot 程序?

就像引入其他庫一樣,我們可以在 Maven 工程中加入 SpringBoot 依賴。然而,最好是從 spring-boot-starter-parent 項目中繼承以及聲明依賴到 Spring Boot starters。這樣做可以使我們的項目可以重用 SpringBoot 的默認配置。

繼承 spring-boot-starter-parent 項目依賴很簡單 – 我們只需要在 pom.xml 中定義一個 parent 節點:

1
2 org.springframework.boot
3 spring-boot-starter-parent
4 2.1.1.RELEASE
5

我們可以在 Maven central 中找到 spring-boot-starter-parent 的最新版本。

使用 starter 父項目依賴很方便,但並非總是可行。例如,如果我們公司都要求項目繼承標準 POM,我們就不能依賴 SpringBoot starter 了。

這種情況,我們可以通過對 POM 元素的依賴管理來處理:

1
2
3
4 org.springframework.boot
5 spring-boot-dependencies
6 2.1.1.RELEASE
7 pom
8 import
9
10
11

最後,我們可以添加 SpringBoot starter 中一些依賴,然後我們就可以開始了。
9、如何實現 Spring Boot 應用程序的安全性?

爲了實現 Spring Boot 的安全性,我們使用 spring-boot-starter-security 依賴項,並且必須添加安全配置。它只需要很少的代碼。配置類將必須擴展WebSecurityConfigurerAdapter 並覆蓋其方法。
10、如何集成 Spring Boot 和 ActiveMQ?

對於集成 Spring Boot 和 ActiveMQ,我們使用依賴關係。 它只需要很少的配置,並且不需要樣板代碼。
11、如何使用 Spring Boot 實現分頁和排序?

使用 Spring Boot 實現分頁非常簡單。使用 Spring Data-JPA 可以實現將可分頁的傳遞給存儲庫方法。
12、如何使用 Spring Boot 實現異常處理?

Spring 提供了一種使用 ControllerAdvice 處理異常的非常有用的方法。 我們通過實現一個 ControlerAdvice 類,來處理控制器類拋出的所有異常。
13、我們如何監視所有 Spring Boot 微服務?

Spring Boot 提供監視器端點以監控各個微服務的度量。這些端點對於獲取有關應用程序的信息(如它們是否已啓動)以及它們的組件(如數據庫等)是否正常運行很有幫助。但是,使用監視器的一個主要缺點或困難是,我們必須單獨打開應用程序的知識點以瞭解其狀態或健康狀況。想象一下涉及 50 個應用程序的微服務,管理員將不得不擊中所有 50 個應用程序的執行終端。爲了幫助我們處理這種情況,我們將使用位於的開源項目。 它建立在 Spring Boot Actuator 之上,它提供了一個 Web UI,使我們能夠可視化多個應用程序的度量。
14、什麼是 Swagger?你用 Spring Boot 實現了它嗎?

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

依賴管理是所有項目中至關重要的一部分。當一個項目變得相當複雜,管理依賴會成爲一個噩夢,因爲當中涉及太多 artifacts 了。

這時候 SpringBoot starter 就派上用處了。每一個 stater 都在扮演着提供我們所需的 Spring 特性的一站式商店角色。其他所需的依賴以一致的方式注入並且被管理。

所有的 starter 都歸於 org.springframework.boot 組中,並且它們都以由 spring-boot-starter- 開頭取名。這種命名方式使得我們更容易找到 starter 依賴,特別是當我們使用那些支持通過名字查找依賴的 IDE 當中。

在寫這篇文章的時候,已經有超過50個 starter了,其中最常用的是:

spring-boot-starter:核心 starter,包括自動化配置支持,日誌以及 YAML
spring-boot-starter-aop:Spring AOP 和 AspectJ 相關的切面編程 starter
spring-boot-starter-data-jpa:使用 Hibernate Spring Data JPA 的 starter
spring-boot-starter-jdbc:使用 HikariCP 連接池 JDBC 的 starter
spring-boot-starter-security:使用 Spring Security 的 starter
spring-boot-starter-test:SpringBoot 測試相關的 starter
spring-boot-starter-web:構建 restful、springMVC 的 web應用程序的 starter

16、怎麼禁用某些自動配置特性?

如果我們想禁用某些自動配置特性,可以使用 @EnableAutoConfiguration 註解的 exclude 屬性來指明。例如,下面的代碼段是使 DataSourceAutoConfiguration 無效:

1 // other annotations
2 @EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
3 public class MyConfiguration { }

如果我們使用 @SpringBootApplication 註解 — 那個將 @EnableAutoConfiguration 作爲元註解的項,來啓用自動化配置,我們能夠使用相同名字的屬性來禁用自動化配置:

1 // other annotations
2 @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
3 public class MyConfiguration { }

我們也能夠使用 spring.autoconfigure.exclude 環境屬性來禁用自動化配置。application.properties 中的這項配置能夠像以前那樣做同樣的事情:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

17、怎麼註冊一個定製的自動化配置?

爲了註冊一個自動化配置類,我們必須在 META-INF/spring.factories 文件中的 EnableAutoConfiguration 鍵下列出它的全限定名:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.baeldung.autoconfigure.CustomAutoConfiguration

如果我們使用 Maven 構建項目,這個文件需要放置在在 package 階段被寫入完成的 resources/META-INF 目錄中。
18、當 bean 存在的時候怎麼置後執行自動配置?

爲了當 bean 已存在的時候通知自動配置類置後執行,我們可以使用 @ConditionalOnMissingBean 註解。這個註解中最值得注意的屬性是:

value:被檢查的 beans 的類型
name:被檢查的 beans 的名字

當將 @Bean 修飾到方法時,目標類型默認爲方法的返回類型:

1 @Configuration
2 public class CustomConfiguration {
3 @Bean
4 @ConditionalOnMissingBean
5 public CustomService service() { … }
6 }

19、怎麼將 SpringBoot web 應用程序部署爲 JAR 或 WAR 文件?

通常,我們將 web 應用程序打包成 WAR 文件,然後將它部署到另外的服務器上。這樣做使得我們能夠在相同的服務器上處理多個項目。當 CPU 和內存有限的情況下,這是一種最好的方法來節省資源。

然而,事情發生了轉變。現在的計算機硬件相比起來已經很便宜了,並且現在的注意力大多轉移到服務器配置上。部署中對服務器配置的一個細小的失誤都會導致無可預料的災難發生。

Spring 通過提供插件來解決這個問題,也就是 spring-boot-maven-plugin 來打包 web 應用程序到一個額外的 JAR 文件當中。爲了引入這個插件,只需要在 pom.xml 中添加一個 plugin 屬性:

1
2 org.springframework.boot
3 spring-boot-maven-plugin
4

有了這個插件,我們會在執行 package 步驟後得到一個 JAR 包。這個 JAR 包包含所需的所有依賴以及一個嵌入的服務器。因此,我們不再需要擔心去配置一個額外的服務器了。

我們能夠通過運行一個普通的 JAR 包來啓動應用程序。

注意一點,爲了打包成 JAR 文件,pom.xml 中的 packgaing 屬性必須定義爲 jar:

jar

如果我們不定義這個元素,它的默認值也爲 jar。

如果我們想構建一個 WAR 文件,將 packaging 元素修改爲 war:

war

並且將容器依賴從打包文件中移除:

1
2 org.springframework.boot
3 spring-boot-starter-tomcat
4 provided
5

執行 Maven 的 package 步驟之後,我們得到一個可部署的 WAR 文件。
20、怎麼使用 SpringBoot 去執行命令行程序?

像其他 Java 程序一樣,一個 SpringBoot 命令行程序必須要有一個 main 方法。這個方法作爲一個入口點,通過調用 SpringApplication#run 方法來驅動程序執行:

1 @SpringBootApplication
2 public class MyApplication {
3 public static void main(String[] args) {
4 SpringApplication.run(MyApplication.class);
5 // other statements
6 }
7 }

SpringApplication 類會啓動一個 Spirng 容器以及自動化配置 beans。

要注意的是我們必須把一個配置類傳遞到 run 方法中作爲首要配置資源。按照慣例,這個參數一般是入口類本身。

在調用 run 方法之後,我們可以像平常的程序一樣執行其他語句。
21、有什麼外部配置的可能來源?

SpringBoot 對外部配置提供了支持,允許我們在不同環境中運行相同的應用。我們可以使用 properties 文件、YAML 文件、環境變量、系統參數和命令行選項參數來聲明配置屬性。

然後我們可以通過 @Value 這個通過 @ConfigurationProperties 綁定的對象的註解或者實現 Enviroment 來訪問這些屬性。

以下是最常用的外部配置來源:

命令行屬性:命令行選項參數是以雙連字符(例如,=)開頭的程序參數,例如 –server.port=8080。SpringBoot將所有參數轉換爲屬性並且添加到環境屬性當中。
應用屬性:應用屬性是指那些從 application.properties 文件或者其 YAML 副本中獲得的屬性。默認情況下,SpringBoot會從當前目錄、classpath 根目錄或者它們自身的 config 子目錄下搜索該文件。
特定 profile 配置:特殊概要配置是從 application-{profile}.properties 文件或者自身的 YAML 副本。{profile} 佔位符引用一個在用的 profile。這些文件與非特定配置文件位於相同的位置,並且優先於它們。

22、SpringBoot 支持鬆綁定代表什麼?

SpringBoot中的鬆綁定適用於配置屬性的類型安全綁定。使用鬆綁定,環境屬性的鍵不需要與屬性名完全匹配。這樣就可以用駝峯式、短橫線式、蛇形式或者下劃線分割來命名。

例如,在一個有 @ConfigurationProperties 聲明的 bean 類中帶有一個名爲 myProp 的屬性,它可以綁定到以下任何一個參數中,myProp、 my-prop、my_prop 或者 MY_PROP。
23、SpringBoot DevTools 的用途是什麼?

SpringBoot 開發者工具,或者說 DevTools,是一系列可以讓開發過程變得簡便的工具。爲了引入這些工具,我們只需要在 POM.xml 中添加如下依賴:

1
2 org.springframework.boot
3 spring-boot-devtools
4

spring-boot-devtools 模塊在生產環境中是默認禁用的,archives 的 repackage 在這個模塊中默認也被排除。因此,它不會給我們的生產環境帶來任何開銷。

通常來說,DevTools 應用屬性適合於開發環境。這些屬性禁用模板緩存,啓用 web 組的調試日誌記錄等等。最後,我們可以在不設置任何屬性的情況下進行合理的開發環境配置。

每當 classpath 上的文件發生更改時,使用 DevTools 的應用程序都會重新啓動。這在開發中非常有用,因爲它可以爲修改提供快速的反饋。

默認情況下,像視圖模板這樣的靜態資源修改後是不會被重啓的。相反,資源的更改會觸發瀏覽器刷新。注意,只有在瀏覽器中安裝了 LiveReload 擴展並以與 DevTools 所包含的嵌入式 LiveReload 服務器交互時,纔會發生。
24、怎麼編寫一個集成測試?

當我們使用 Spring 應用去跑一個集成測試時,我們需要一個 ApplicationContext。

爲了使我們開發更簡單,SpringBoot 爲測試提供一個註解 – @SpringBootTest。這個註釋由其 classes 屬性指示的配置類創建一個 ApplicationContext。

如果沒有配置 classes 屬性,SpringBoot 將會搜索主配置類。搜索會從包含測試類的包開始直到找到一個使用 @SpringBootApplication 或者 @SpringBootConfiguration 的類爲止。

注意如果使用 JUnit4,我們必須使用 @RunWith(SpringRunner.class) 來修飾這個測試類。
25、SpringBoot的 Actuator 是做什麼的?

本質上,Actuator 通過啓用 production-ready 功能使得 SpringBoot 應用程序變得更有生命力。這些功能允許我們對生產環境中的應用程序進行監視和管理。

集成 SpringBoot Actuator 到項目中非常簡單。我們需要做的只是將 spring-boot-starter-actuator starter 引入到 POM.xml 文件當中:

1
2 org.springframework.boot
3 spring-boot-starter-actuator
4

SpringBoot Actuaor 可以使用 HTTP 或者 JMX endpoints來瀏覽操作信息。大多數應用程序都是用 HTTP,作爲 endpoint 的標識以及使用 /actuator 前綴作爲 URL路徑。

這裏有一些常用的內置 endpoints Actuator:

auditevents:查看 audit 事件信息
env:查看 環境變量
health:查看應用程序健康信息
httptrace:展示 HTTP 路徑信息
info:展示 arbitrary 應用信息
metrics:展示 metrics 信息
loggers:顯示並修改應用程序中日誌器的配置
mappings:展示所有 @RequestMapping 路徑信息
scheduledtasks:展示應用程序中的定時任務信息
threaddump:執行 Thread Dump

26、什麼是 AOP?

在軟件開發過程中,跨越應用程序多個點的功能稱爲交叉問題。這些交叉問題與應用程序的主要業務邏輯不同。因此,將這些橫切關注與業務邏輯分開是面向方面編程(AOP)的地方。
27、什麼是 Apache Kafka?

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

CSRF 代表跨站請求僞造。這是一種攻擊,迫使最終用戶在當前通過身份驗證的Web 應用程序上執行不需要的操作。CSRF 攻擊專門針對狀態改變請求,而不是數據竊取,因爲攻擊者無法查看對僞造請求的響應。
29、什麼是 WebSockets?

WebSocket 是一種計算機通信協議,通過單個 TCP 連接提供全雙工通信信道。

1、WebSocket 是雙向的 -使用 WebSocket 客戶端或服務器可以發起消息發送。

2、WebSocket 是全雙工的 -客戶端和服務器通信是相互獨立的。

3、單個 TCP 連接 -初始連接使用 HTTP,然後將此連接升級到基於套接字的連接。然後這個單一連接用於所有未來的通信

4、Light -與 http 相比,WebSocket 消息數據交換要輕得多。
30、您使用了哪些 starter maven 依賴項?

使用了下面的一些依賴項

spring-boot-starter-activemq

spring-boot-starter-security

這有助於增加更少的依賴關係,並減少版本的衝突。
31、什麼是 Spring Batch?

Spring Boot Batch 提供可重用的函數,這些函數在處理大量記錄時非常重要,包括日誌/跟蹤,事務管理,作業處理統計信息,作業重新啓動,跳過和資源管理。它還提供了更先進的技術服務和功能,通過優化和分區技術,可以實現極高批量和高性能批處理作業。簡單以及複雜的大批量批處理作業可以高度可擴展的方式利用框架處理重要大量的信息。
32、什麼是 FreeMarker 模板?

FreeMarker 是一個基於 Java 的模板引擎,最初專注於使用 MVC 軟件架構進行動態網頁生成。使用 Freemarker 的主要優點是表示層和業務層的完全分離。程序員可以處理應用程序代碼,而設計人員可以處理 html 頁面設計。最後使用freemarker 可以將這些結合起來,給出最終的輸出頁面。
33、什麼是 Spring Profiles?

Spring Profiles 允許用戶根據配置文件(dev,test,prod 等)來註冊 bean。因此,當應用程序在開發中運行時,只有某些 bean 可以加載,而在 PRODUCTION中,某些其他 bean 可以加載。假設我們的要求是 Swagger 文檔僅適用於 QA 環境,並且禁用所有其他文檔。這可以使用配置文件來完成。Spring Boot 使得使用配置文件非常簡單。

發佈了44 篇原創文章 · 獲贊 60 · 訪問量 9277
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章