SpringBoot面試題整理

1、什麼是SpringBoot?

Spring Boot是Pivotal公司推出的一個全新框架,其目的是爲了簡化Spring項目的初始搭建以及開發過程。html

2、SpringBoot有什麼特色?

1)內置服務器,默認使用tomcat服務器前端

2)開箱即用,減小繁瑣的配置過程java

3)上手容易,提升開發效率程序員

4)可避免大量Maven導入和版本衝突web

3、SpringBoot的核心註解是哪一個?它主要由哪幾個註解組成的?

Spring Boot核心註解是@SpringBootApplication,它主要由@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan組成。spring

@SpringBootConfiguration:繼承自@Configuration,兩者功能也一致,標註當前類是配置類。數據庫

@EnableAutoConfiguration:這個註釋啓用了Spring Boot的自動配置功能,能夠自動爲您配置不少東西。apache

@ComponentScan:根據定義的掃描路徑,把符合掃描規則的類裝配到spring的bean容器中json

  • 自定掃描路徑下邊帶有@Controller,@Service,@Repository,@Component註解加入spring容器
  • 經過includeFilters加入掃描路徑下沒有以上註解的類加入spring容器
  • 經過excludeFilters過濾出不用加入spring容器的類
  • 自定義增長了@Component註解的註解方式

4、SpringBoot自動配置的原理是什麼?

@EnableAutoConfiguration實現自動配置,其內部實際上就是去加載MMETA-INF/spring.factories文件的信息,而後篩選出以@EnableAutoConfiguration爲key的數據,加載到IOC容器中,實現自動配置。bootstrap

5、什麼是YAML?

YAML是一種數據序列化語言,一般用於配置文件,例如application.yml。

6、YAML優點在哪裏?

(1)配置有序

(2)樹形結構,清晰明瞭

(3)支持數組,數組中的元素能夠是基本數據和對象

7、SpringBoot是否可使用XML配置 ?

Spring Boot推薦使用Java配置,可是一樣也可使用XML配置。

8、spring boot 核心配置文件是什麼?bootstrap.properties 和 application.properties 有何區別 ?

spring boot核心配置文件是application.properties或者application.yml。

  • bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加載的,比 applicaton 優先加載,配置在應用程序上下文的引導階段生效。通常來講咱們在 Spring Cloud Config 或者 Nacos 中會用到它。且 boostrap 裏面的屬性不能被覆蓋;
  • application (. yml 或者 . properties): 由ApplicatonContext 加載,用於 spring boot 項目的自動化配置。

9、什麼是Spring Profiles?

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

10、如何在自定義端口上運行Spring Boot應用程序?

在項目的配置文件中能夠自定義運行的端口。

application.properties

# 自定義端口
server.port = 8081

application.yml

# 自定義端口
server:
	port: 8081

11、如何實現Spring Boot應用程序的安全性?

爲了實現 Spring Boot 的安全性,咱們使用 spring-boot-starter-security 依賴項,而且必須添加安全配置。它只須要不多的代碼,配置類將必須擴展WebSecurityConfigurerAdapter並覆蓋其方法。

12、比較一下Spring Security和Shiro各自的優缺點 ?

因爲Spring Boot官方提供了大量的很是方便的開箱即用的Starter,包括Spring Security的Starter ,使得在Spring Boot中使用Spring Security變得更加容易,甚至只須要添加一個依賴就能夠保護全部的接口,因此,若是是Spring Boot項目,通常選擇Spring Security。固然這只是一個建議的組合,單純從技術上來講,不管怎麼組合,都是沒有問題的。Shiro和Spring Security相比,主要有以下一些特色:

1)Spring Security 是一個重量級的安全管理框架;Shiro 則是一個輕量級的安全管理框架

2)Spring Security 概念複雜,配置繁瑣;Shiro 概念簡單、配置簡單

3)Spring Security 功能強大;Shiro 功能簡單

十3、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);
    }
}

十4、什麼是CSRF攻擊?

CSRF表明跨站請求僞造,這是一種攻擊,迫使最終用戶在當前經過身份驗證的Web應用程序上執行不須要的操做,CSRF攻擊專門針對狀態改變請求,而不是數據竊取,由於攻擊者沒法查看對僞造請求的響應。

十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提供監視器端點以監控各個微服務的度量。這些端點對於獲取有關應用程序的信息(如它們是否已啓動)以及它們的組件(如數據庫等)是否正常運行頗有幫助。可是,使用監視器的一個主要缺點或困難是,咱們必須單獨打開應用程序的知識點以瞭解其狀態或健康情況。想象一下涉及50個應用程序的微服務,管理員將不得不擊中全部50個應用程序的執行終端。爲了幫助咱們處理這種狀況,咱們將使用位於的開源項目。 它創建在Spring Boot Actuator之上,它提供了一個Web UI,使咱們可以可視化多個應用程序的度量。

十8、什麼是WebSockets?

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

一、WebSocket 是雙向的 -使用 WebSocket 客戶端或服務器能夠發起消息發送。

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

三、單個 TCP 鏈接 -初始鏈接使用 HTTP,而後將此鏈接升級到基於套接字的鏈接。而後這個單一鏈接用於全部將來的通訊。

四、Light -與 http 相比,WebSocket 消息數據交換要輕得多。

十9、什麼是Spring Data ?

Spring Data是Spring的一個子項目,用於簡化數據庫訪問,支持NoSQL和關係數據存儲,其主要目標是使數據庫的訪問變得方便快捷。Spring Data具備以下特色:

SpringData項目支持NoSQL存儲:

  1. MongoDB (文檔數據庫)
  2. Neo4j(圖形數據庫)
  3. Redis(鍵/值存儲)
  4. Hbase(列族數據庫)

SpringData項目所支持的關係數據存儲技術:

  1. JDBC
  2. JPA

Spring Data Jpa致力於減小數據訪問層(DAO)的開發量. 開發者惟一要作的,就是聲明持久層的接口,其餘都交給Spring Data JPA來幫你完成!Spring Data JPA經過規範方法的名字,根據符合規範的名字來肯定方法須要實現什麼樣的邏輯。

二10、什麼是Spring Batch?

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

二11、什麼是FreeMarker模板?

FreeMarker是一個基於Java的模板引擎,最初專一於使用MVC軟件架構進行動態網頁生成。使用 Freemarker的主要優勢是表示層和業務層的徹底分離。程序員能夠處理應用程序代碼,而設計人員能夠處理html頁面設計。最後使用freemarker能夠將這些結合起來,給出最終的輸出頁面。

二12、如何集成Spring Boot和ActiveMQ?

對於集成Spring Boot和ActiveMQ,咱們使用依賴關係,它只須要不多的配置,而且不須要樣板代碼。

二十3、什麼是Apache Kafka?

Apache Kafka是一個分佈式發佈 - 訂閱消息系統。它是一個可擴展的,容錯的發佈 - 訂閱消息系統,它使咱們可以構建分佈式應用程序。這是一個Apache頂級項目。Kafka適合離線和在線消息消費。

二十4、什麼是 Swagger?你用Spring Boot實現了它嗎?

Swagger普遍用於可視化API,使用Swagger UI爲前端開發人員提供在線沙箱。Swagger是用於生成 RESTful Web服務的可視化表示的工具,規範和完整框架實現。它使文檔可以以與服務器相同的速度更新。當經過Swagger正肯定義時,消費者可使用最少許的實現邏輯來理解遠程服務並與其進行交互。所以,Swagger消除了調用服務時的猜想。

二十6、先後端分離,如何維護接口文檔 ?

先後端分離開發日益流行,大部分狀況下,咱們都是經過Spring Boot作先後端分離開發,先後端分離必定會有接口文檔,否則會先後端會深深陷入到扯皮中。一個比較笨的方法就是使用word或者md來維護接口文檔,可是效率過低,接口一變,全部人手上的文檔都得變。在Spring Boot中,這個問題常見的解決方案是Swagger ,使用Swagger咱們能夠快速生成一個接口文檔網站,接口一旦發生變化,文檔就會自動更新,全部開發工程師訪問這一個在線網站就能夠獲取到最新的接口文檔,很是方便。

二十7、如何從新加載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>

二十8、Spring Boot 中的 starter 究竟是什麼 ?

首先,這個Starter並不是什麼新的技術點,基本上仍是基於Spring已有功能來實現的。首先它提供了一個自動化配置類,通常命名爲XXXAutoConfiguration ,在這個配置類中經過條件註解來決定一個配置是否生效(條件註解就是 Spring 中本來就有的),而後它還會提供一系列的默認配置,也容許開發者根據實際狀況自定義相關配置,而後經過類型安全的屬性注入將這些配置屬性注入進來,新注入的屬性會代替掉默認屬性。正由於如此,不少第三方框架,咱們只須要引入依賴就能夠直接使用了。固然,開發者也能夠自定義Starter。

二十9、spring-boot-starter-parent 有什麼用 ?

咱們都知道,新建立一個 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。

三10、Spring Boot打成的jar和普通的jar有什麼區別 ?

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 ,一個可執行,一個可引用。

三11、運行Spring Boot有哪幾種方式?

1)直接運行main文件

2)打包用命令或放到容器中運行

3)用Maven/Gradle插件運行

三12、Spring Boot須要獨立的容器運行嗎?

能夠不須要,由於Spring Boot有內嵌服務器tomcat

三十3、開啓Spring Boot特性有哪幾種方式?

1)繼承spring-boot-starter-parent項目

2)導入spring-boot-dependencies項目依賴

三十4、如何使用Spring Boot實現異常處理?

Spring提供了一種使用ControllerAdvice處理異常的很是有用的方法。咱們經過實現一個 ControlerAdvice類,來處理控制器類拋出的全部異常。

三十5、如何使用 Spring Boot 實現分頁和排序?

使用Spring Data-JPA能夠實現將可分頁的傳遞給存儲庫方法。

三十6、微服務中如何實現session共享 ?

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

三十7、Spring Boot中如何實現定時任務 ?

定時任務也是一個常見的需求,Spring Boot中對於定時任務的支持主要仍是來自Spring框架。在Spring Boot中使用定時任務主要有兩種不一樣的方式,一個就是使用Spring中的@Scheduled註解,另外一個則是使用第三方框架Quartz。

相關文章
相關標籤/搜索