有讀者聯繫我,如今疫情已經基本獲得控制,面試的通知也多了起來,可是,可能由於是失業的人有點多,並且大學生也開始出來找實習,因此,對於這些面試的人員,尤爲是有幾年工做經驗的,要求感受有那麼一點點的升高,有沒有什麼面試方面的文檔進行整理啊,小意思,知足你,今天就整理部分SpringBoot的面試題,以爲有幫助的,歡迎點贊+關注,後期會不斷的更新這些技術題html
不過,小編想在這裏補充一句,其實小編以爲,疫情多是一點緣由,可是,也不能只責怪疫情,有這樣一句話,互聯網紅利期已通過去的差很少了,接下來,這個行業還會大量招人,可是更多的,是要求精英型人才,就要求你要不斷地提高去適應這個發展的需求,纔會不會淘汰,或者提高本身的競爭力,從而在這個大海中游刃有餘。前端
好了,又話癆了,來看這些面試題吧java
Spring Boot 是 Spring 開源組織下的子項目,是 Spring 組件一站式解決方案,主要是簡化了使用 Spring 的難度,簡省了繁重的配置,提供了各類啓動器,開發者能快速上手。程序員
Spring Boot 主要有以下優勢:面試
容易上手,提高開發效率,爲 Spring 開發提供一個更快、更普遍的入門體驗。spring
開箱即用,遠離繁瑣的配置。數據庫
提供了一系列大型項目通用的非業務性功能,例如:內嵌服務器、安全管理、運行數據監控、運行情況檢查和外部化配置等。json
沒有代碼生成,也不須要XML配置。bootstrap
避免大量的 Maven 導入和各類版本衝突。後端
Spring Boot 的核心註解是哪一個?它主要由哪幾個註解組成的?
啓動類上面的註解是@SpringBootApplication,它也是 Spring Boot 的核心註解,主要組合包含了如下 3 個註解:
@SpringBootConfiguration:組合了 @Configuration 註解,實現配置文件的功能。
@EnableAutoConfiguration:打開自動配置的功能,也能夠關閉某個自動配置的選項,如關閉數據源自動配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
@ComponentScan:Spring組件掃描。
配置
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,不須要任何強制轉換或基於字符串的查找。
註解 @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 配置和傳統的 properties 配置相比到底有哪些優點呢?
配置有序,在一些特殊的場景下,配置有序很關鍵
支持數組,數組中的元素能夠是基本數據類型也能夠是對象
簡潔
相比 properties 配置文件,YAML 還有一個缺點,就是不支持 @PropertySource 註解導入自定義的 YAML 配置。
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 容許用戶根據配置文件(dev,test,prod 等)來註冊 bean。所以,當應用程序在開發中運行時,只有某些 bean 能夠加載,而在 PRODUCTION中,某些其餘 bean 能夠加載。假設咱們的要求是 Swagger 文檔僅適用於 QA 環境,而且禁用全部其餘文檔。這可使用配置文件來完成。Spring Boot 使得使用配置文件很是簡單。
如何在自定義端口上運行 Spring Boot 應用程序?
爲了在自定義端口上運行 Spring Boot 應用程序,您能夠在application.properties 中指定端口。server.port = 8090
爲了實現 Spring Boot 的安全性,咱們使用 spring-boot-starter-security 依賴項,而且必須添加安全配置。它只須要不多的代碼。配置類將必須擴展WebSecurityConfigurerAdapter 並覆蓋其方法。
因爲 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 功能簡單
跨域能夠在前端經過 JSONP 來解決,可是 JSONP 只能夠發送 GET 請求,沒法發送其餘類型的請求,在 RESTful 風格的應用中,就顯得很是雞肋,所以咱們推薦在後端經過 (CORS,Cross-origin resource sharing) 來解決跨域問題。這種解決方案並不是 Spring Boot 特有的,在傳統的 SSM 框架中,就能夠經過 CORS 來解決跨域問題,只不過以前咱們是在 XML 文件中配置 CORS ,如今能夠經過實現WebMvcConfigurer接口而後重寫addCorsMappings方法解決跨域問題。
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.maxAge(3600);
}
}
項目中先後端分離部署,因此須要解決跨域的問題。
咱們使用cookie存放用戶登陸的信息,在spring攔截器進行權限控制,當權限不符合時,直接返回給用戶固定的json結果。
當用戶登陸之後,正常使用;當用戶退出登陸狀態時或者token過時時,因爲攔截器和跨域的順序有問題,出現了跨域的現象。
咱們知道一個http請求,先走filter,到達servlet後才進行攔截器的處理,若是咱們把cors放在filter裏,就能夠優先於權限攔截器執行。
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(urlBasedCorsConfigurationSource);
}
}
CSRF 表明跨站請求僞造。這是一種攻擊,迫使最終用戶在當前經過身份驗證的Web 應用程序上執行不須要的操做。CSRF 攻擊專門針對狀態改變請求,而不是數據竊取,由於攻擊者沒法查看對僞造請求的響應。
監視器
Spring boot actuator 是 spring 啓動框架中的重要功能之一。Spring boot 監視器可幫助您訪問生產環境中正在運行的應用程序的當前狀態。有幾個指標必須在生產環境中進行檢查和監控。即便一些外部應用程序可能正在使用這些服務來向相關人員觸發警報消息。監視器模塊公開了一組可直接做爲 HTTP URL 訪問的REST 端點來檢查狀態。
默認狀況下,全部敏感的 HTTP 端點都是安全的,只有具備 ACTUATOR 角色的用戶才能訪問它們。安全性是使用標準的 HttpServletRequest.isUserInRole 方法實施的。 咱們可使用來禁用安全性。只有在執行機構端點在防火牆後訪問時,才建議禁用安全性。
Spring Boot 提供監視器端點以監控各個微服務的度量。這些端點對於獲取有關應用程序的信息(如它們是否已啓動)以及它們的組件(如數據庫等)是否正常運行頗有幫助。可是,使用監視器的一個主要缺點或困難是,咱們必須單獨打開應用程序的知識點以瞭解其狀態或健康情況。想象一下涉及 50 個應用程序的微服務,管理員將不得不集中全部 50 個應用程序的執行終端。爲了幫助咱們處理這種狀況,咱們將使用位於的開源項目。 它創建在 Spring Boot Actuator 之上,它提供了一個 Web UI,使咱們可以可視化多個應用程序的度量。
整合第三方項目
WebSocket 是一種計算機通訊協議,經過單個 TCP 鏈接提供全雙工通訊信道。
一、WebSocket 是雙向的 -使用 WebSocket 客戶端或服務器能夠發起消息發送。
二、WebSocket 是全雙工的 -客戶端和服務器通訊是相互獨立的。
三、單個 TCP 鏈接 -初始鏈接使用 HTTP,而後將此鏈接升級到基於套接字的鏈接。而後這個單一鏈接用於全部將來的通訊
四、Light -與 http 相比,WebSocket 消息數據交換要輕得多。
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 Boot Batch 提供可重用的函數,這些函數在處理大量記錄時很是重要,包括日誌/跟蹤,事務管理,做業處理統計信息,做業從新啓動,跳過和資源管理。它還提供了更先進的技術服務和功能,經過優化和分區技術,能夠實現極高批量和高性能批處理做業。簡單以及複雜的大批量批處理做業能夠高度可擴展的方式利用框架處理重要大量的信息。
FreeMarker 是一個基於 Java 的模板引擎,最初專一於使用 MVC 軟件架構進行動態網頁生成。使用 Freemarker 的主要優勢是表示層和業務層的徹底分離。程序員能夠處理應用程序代碼,而設計人員能夠處理 html 頁面設計。最後使用freemarker 能夠將這些結合起來,給出最終的輸出頁面。
如何集成 Spring Boot 和 ActiveMQ?
對於集成 Spring Boot 和 ActiveMQ,咱們使用依賴關係。 它只須要不多的配置,而且不須要樣板代碼。
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 數據庫控制檯以更好地測試應用程序。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
您使用了哪些 starter maven 依賴項?
使用了下面的一些依賴項
spring-boot-starter-activemq
spring-boot-starter-security
這有助於增長更少的依賴關係,並減小版本的衝突。
首先,這個 Starter 並不是什麼新的技術點,基本上仍是基於 Spring 已有功能來實現的。首先它提供了一個自動化配置類,通常命名爲 XXXAutoConfiguration ,在這個配置類中經過條件註解來決定一個配置是否生效(條件註解就是 Spring 中本來就有的),而後它還會提供一系列的默認配置,也容許開發者根據實際狀況自定義相關配置,而後經過類型安全的屬性注入將這些配置屬性注入進來,新注入的屬性會代替掉默認屬性。正由於如此,不少第三方框架,咱們只須要引入依賴就能夠直接使用了。固然,開發者也能夠自定義 Starter
咱們都知道,新建立一個 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 ,這種 jar 能夠直接經過 java -jar xxx.jar 命令來運行,這種 jar 不能夠做爲普通的 jar 被其餘項目依賴,即便依賴了也沒法使用其中的類。
Spring Boot 的 jar 沒法被其餘項目依賴,主要仍是他和普通 jar 的結構不一樣。普通的 jar 包,解壓後直接就是包名,包裏就是咱們的代碼,而 Spring Boot 打包成的可執行 jar 解壓後,在 \BOOT-INF\classes 目錄下才是咱們的代碼,所以沒法被直接引用。若是非要引用,能夠在 pom.xml 文件中增長配置,將 Spring Boot 項目打包成兩個 jar ,一個可執行,一個可引用。
1)打包用命令或者放到容器中運行
2)用 Maven/ Gradle 插件運行
3)直接執行 main 方法運行
能夠不須要,內置了 Tomcat/ Jetty 等容器。
開啓 Spring Boot 特性有哪幾種方式?
1)繼承spring-boot-starter-parent項目
2)導入spring-boot-dependencies項目依賴
Spring 提供了一種使用 ControllerAdvice 處理異常的很是有用的方法。 咱們經過實現一個 ControlerAdvice 類,來處理控制器內拋出的全部異常。
使用 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 框架。
在 Spring Boot 中使用定時任務主要有兩種不一樣的方式,一個就是使用 Spring 中的 @Scheduled 註解,另外一個則是使用第三方框架 Quartz。
使用 Spring 中的 @Scheduled 的方式主要經過 @Scheduled 註解來實現。
使用 Quartz ,則按照 Quartz 的方式,定義 Job 和 Trigger 便可。
文章首發公衆號:Java架構師聯盟,每日更新技術好文