1. 程式人生 > 其它 >Spring Boot面試題(2020最新版)

Spring Boot面試題(2020最新版)

Spring Boot面試題(2020最新版)

Spring Boot 有哪些優點?

Spring Boot 主要有如下優點:

容易上手,提升開發效率,為 Spring 開發提供一個更快、更廣泛的入門體驗。
開箱即用,遠離繁瑣的配置。
提供了一系列大型專案通用的非業務性功能,例如:內嵌伺服器、安全管理、執行資料監控、執行狀況檢查和外部化配置等。
沒有程式碼生成,也不需要XML配置。
避免大量的 Maven 匯入和各種版本衝突。

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

@SpringBootConfiguration:組合了 @Configuration 註解,實現配置檔案的功能。

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

@ComponentScan:Spring元件掃描。

什麼是 JavaConfig?

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,不需要任何強制轉換或基於字串的查詢。

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

註解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自動配置的核心,
@EnableAutoConfiguration 給容器匯入META-INF/spring.factories 裡定義的自動配置類。
篩選有效的自動配置類。
每一個自動配置類結合對應的 xxxProperties.java 讀取配置檔案進行自動配置功能
 

Spring Boot 是否可以使用 XML 配置 ?

Spring Boot 推薦使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通過 @ImportResource 註解可以引入一個 XML 配置。

什麼是 Spring Profiles?

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

Spring Boot 中如何解決跨域問題 ?

跨域可以在前端通過 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 攻擊?

CSRF 代表跨站請求偽造。這是一種攻擊,迫使終端使用者在當前通過身份驗證的Web 應用程式上執行不需要的操作。CSRF 攻擊專門針對狀態改變請求,而不是資料竊取,因為攻擊者無法檢視對偽造請求的響應。

Spring Boot 中的監視器是什麼?

Spring boot actuator 是 spring 啟動框架中的重要功能之一。Spring boot 監視器可幫助您訪問生產環境中正在執行的應用程式的當前狀態。有幾個指標必須在生產環境中進行檢查和監控。即使一些外部應用程式可能正在使用這些服務來向相關人員觸發警報訊息。監視器模組公開了一組可直接作為 HTTP URL 訪問的REST 端點來檢查狀態。
 

什麼是 WebSockets?

WebSocket 是一種計算機通訊協議,通過單個 TCP 連線提供全雙工通訊通道。
1、WebSocket 是雙向的 -使用 WebSocket 客戶端或伺服器可以發起訊息傳送。
2、WebSocket 是全雙工的 -客戶端和伺服器通訊是相互獨立的。
3、單個 TCP 連線 -初始連線使用 HTTP,然後將此連線升級到基於套接字的連線。然後這個單一連線用於所有未來的通訊
4、Light -與 http 相比,WebSocket 訊息資料交換要輕得多。

Spring Boot 中的 starter 到底是什麼 ?

先,這個 Starter 並非什麼新的技術點,基本上還是基於 Spring 已有功能來實現的。首先它提供了一個自動化配置類,一般命名為 XXXAutoConfiguration ,在這個配置類中通過條件註解來決定一個配置是否生效(條件註解就是 Spring 中原本就有的),然後它還會提供一系列的預設配置,也允許開發者根據實際情況自定義相關配置,然後通過型別安全的屬性注入將這些配置屬性注入進來,新注入的屬性會代替掉預設屬性。正因為如此,很多第三方框架,我們只需要引入依賴就可以直接使用了。當然,開發者也可以自定義 Starter

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 Boot 有哪幾種方式?

1)打包用命令或者放到容器中執行
2)用 Maven/ Gradle 外掛執行
3)直接執行 main 方法執行

微服務中如何實現 session 共享 ?

在微服務中,一個完整的專案被拆分成多個不相同的獨立的服務,各個服務獨立部署在不同的伺服器上,各自的 session 被從物理空間上隔離開了,但是經常,我們需要在不同微服務之間共享 session ,常見的方案就是 Spring Session + Redis 來實現 session 共享。將所有微服務的 session 統一儲存在 Redis 上,當各個微服務對 session 有相關的讀寫操作時,都去操作 Redis 上的 session 。這樣就實現了 session 共享,Spring Session 基於 Spring 中的代理過濾器實現,使得 session 的同步操作對開發人員而言是透明的,非常簡便。

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

定時任務也是一個常見的需求,Spring Boot 中對於定時任務的支援主要還是來自 Spring 框架。
在 Spring Boot 中使用定時任務主要有兩種不同的方式,一個就是使用 Spring 中的 @Scheduled 註解,另一個則是使用第三方框架 Quartz。
使用 Spring 中的 @Scheduled 的方式主要通過 @Scheduled 註解來實現。
使用 Quartz ,則按照 Quartz 的方式,定義 Job 和 Trigger 即可。