天天看點

Spring Boot面試題(2022最新版)

Spring Boot面試題(2022最新版)

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 即可。      

作者:三号小玩家