SpringBoot面試題


SpringBoot基礎

1、什么是SpringBoot?

1 通過自動配置方式簡化Spring應用的開發,弱化配置,遵循約定大於配置的原則,使開發者專注於業務開發而無需過多考慮配置相關操作,通過啟動類的main方法一鍵啟動應用。

2、SpringBoot有哪些優點?

 1 1、獨立運行。
 2     內嵌了servlet,tomat等,不需要打成war包部署到容器中,只需要將SpringBoot項目打成jar包就能獨立運行。
 3 
 4 2、簡化配置
 5     啟動器自動依賴其他組件,簡少了 maven 的配置。各種常用組件及配置已經默認配置完成,無需過多干預。
 6 
 7 3、避免大量的Maven導入和各種版本沖突
 8 
 9 4、應用監控
10     Spring Boot 提供一系列端點可以監控服務及應用。

3、SpringBoot的核心注解是什么?由那些注解組成?

1 核心注解為:@SpringBootApplication
2 
3 該注解主要由三個注解組成:
4     @SpringBootConfiguration():代表當前是一個配置類
5     @EnableAutoConfiguration(): 啟動自動配置
6     @ComponentScan():指定掃描哪些Spring注解

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

1、SpringBoot啟動的時候加載主配置類,開啟了自動配置功能@EnableAutoConfiguration。

2、查看@EnableAutoConfiguration,其作用是利用AutoConfigurationImportSelector給容器中導入一些組件。

3、查看AutoConfigurationImportSelector,其中public String[] selectImports(AnnotationMetadata annotationMetadata)方法內 最終調用getCandidateConfigurations()方法

4、查看 getCandidateConfigurations(AnnotationMetadata metadata,     AnnotationAttributes attributes),獲取候選的配置,這個是掃描所有jar包類路徑下"META-INF/spring.factories"

5、然后把掃描到的這些文件包裝成Properties對象。

6、從properties中獲取到EnableAutoConfiguration.class類名對應的值,然后把他們添加在容器中。

簡而言之,整個過程就是將類路徑下"META-INF/spring.factories"里面配置的所有EnableAutoConfiguration的值加入到容器中。

5、你如何理解SpringBoot配置加載順序?

 

6、運行 SpringBoot 有哪幾種方式?

1 1、直接執行 main 方法運行
2 2、打包用Java命令行執行
3 3、用 Maven/ Gradle 插件運行

7、SpringBoot 需要獨立的容器運行嗎?

不需要,SpringBoot內置tomcat/jetty等容器

8、開啟SpringBoot 特性有哪幾種方式?

1 繼承spring-boot-starter-parent項目
2 導入spring-boot-dependencies項目依賴

9、SpringBoot、Spring MVC和Spring有什么區別?

Spring:主要用來創建IOC容器,依賴注入,實現程序間的松耦合
SpringMVC: 主要是用來做WEB開發,通過各種組件的協調配合,簡化Web應用的開發
SpringBoot: SpringBoot更像是一個管家,當使用到對應功能時,只需要導入指定應用啟動器,SpringBoot就能夠在底層默認其配置,大大簡化了開發所需的繁雜配置

10、SpringBoot啟動時都做了什么?

Springboot的啟動,主要創建了配置環境 (environment)、事件監聽 (listeners)、應用上下文 (applicationContext),並基於以上條件,在容器中開始實例化我們需要的Bean,至此,通過SpringBoot啟動的程序
已經構造完成。

 

SpringBoot配置

什么是YAML?

1 YAML 是一種人類可讀的數據序列化語言。它通常用於配置文件。與屬性文件相比,如果我們想要在配置文件中添加復雜的屬性,YAML 文件就更加結構化,而且更少混淆。可以看出 YAML 具有分層配置數據。

YAML 配置的優勢在哪里 ?

1 配置有序,在一些特殊的場景下,配置有序很關鍵
2 支持數組,數組中的元素可以是基本數據類型也可以是對象
3 簡潔

相比 properties 配置文件,YAML 還有一個缺點,就是不支持 @PropertySource 注解導入自定義的 YAML 配置。

SpringBoot 是否可以使用 XML 配置 ?

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

SpringBoot核心配置文件是什么?

bootstrap.propertiesapplication.properties

bootstrap.properties和application.properties 有何區別 ?

1 bootstrap(.yml 或者 .properties):boostrap 由父 ApplicationContext 加載的,比applicaton優先加載,配置在應用程序上下文的引導階段生效。一般來說我們在 SpringCloud Config 
 或者Nacos中會用到它。且boostrap里面的屬性不能被覆蓋;
2 application (.yml或者.properties):由ApplicatonContext 加載,用於 SpringBoot項目的自動化配置。

什么是Spring Profiles?

為了適應多環境配置,可以在項目中配置多個application配置文件,根據應用場景不同,通過application-*中的*來決定啟用某個配置文件。

SpringBoot安全性

如何實現SpringBoot應用程序的安全性?

 

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

 

SpringBoot中如何解決跨域問題 ?

1、基於WebMvcConfigurerAdapter配置加入Cors的跨域

跨域可以在前端通過 JSONP 來解決,但是 JSONP 只可以發送 GET 請求,無法發送其他類型的請求,在 RESTful 風格的應用中,就顯得非常雞肋,因此我們推薦在后端通過(CORS,Cross-origin resource sharing)
來解決跨域問題。這種解決方案並非 Spring Boot 特有的,在傳統的 SSM 框架中,就可以通過 CORS 來解決跨域問題,只不過之前我們是在 XML 文件中配置 CORS ,現在可以通過實現WebMvcConfigurer接口然后重寫
addCorsMappings方法解決跨域問題
 1 @Configuration
 2 public class CorsConfig implements WebMvcConfigurer {
 3  4     @Override
 5     public void addCorsMappings(CorsRegistry registry) {
 6         registry.addMapping("/**")
 7                 .allowedOrigins("*")
 8                 .allowCredentials(true)
 9                 .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
10                 .maxAge(3600);
11     }
12 13 }

2、創建一個filter解決跨域

項目中前后端分離部署,所以需要解決跨域的問題。 我們使用cookie存放用戶登錄的信息,在spring攔截器進行權限控制,當權限不符合時,直接返回給用戶固定的json結果。 當用戶登錄以后,正常使用;當用戶退出登錄
狀態時或者token過期時,由於攔截器和跨域的順序有問題,出現了跨域的現象。 我們知道一個http請求,先走filter,到達servlet后才進行攔截器的處理,如果我們把cors放在filter里,就可以優先於權限攔截器執行。
 1 @Configuration
 2 public class CorsConfig {
 3  4     @Bean
 5     public CorsFilter corsFilter() {
 6         CorsConfiguration corsConfiguration = new CorsConfiguration();
 7         corsConfiguration.addAllowedOrigin("*");
 8         corsConfiguration.addAllowedHeader("*");
 9         corsConfiguration.addAllowedMethod("*");
10         corsConfiguration.setAllowCredentials(true);
11         
12         UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
13         urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
14         return new CorsFilter(urlBasedCorsConfigurationSource);
15     }
16 17 }

3、controller配置CORS

controller方法的CORS配置,您可以向@RequestMapping注解處理程序方法添加一個@CrossOrigin注解,以便啟用CORS(默認情況下,@CrossOrigin允許在@RequestMapping注解中指定的所有源和HTTP方法)
 1 @RestController
 2 @RequestMapping("/account")
 3 public class AccountController {
 4  
 5     @CrossOrigin
 6     @GetMapping("/{id}")
 7     public Account retrieve(@PathVariable Long id) {
 8         // ...
 9     }
10  
11     @DeleteMapping("/{id}")
12     public void remove(@PathVariable Long id) {
13         // ...
14     }
15 }
@CrossOrigin 表示所有的URL均可訪問此資源 @CrossOrigin(origins = “http://127.0.0.1:8080”) 
//表示只允許這一個url可以跨域訪問這個controller 代碼說明:@CrossOrigin這個注解用起來很方便,這個可以用在方法上,也可以用在類上。如果你不設置他的value屬性,或者是origins屬性,
就默認是可以允許所有的URL/域訪問。
  -value屬性可以設置多個URL。   -origins屬性也可以設置多個URL。   -maxAge屬性指定了准備響應前的緩存持續的最大時間。就是探測請求的有效期。   -allowCredentials屬性表示用戶是否可以發送、處理 cookie。默認為false   -allowedHeaders 屬性表示允許的請求頭部有哪些。   -methods 屬性表示允許請求的方法,默認get,post,head。

@CrossOrigin不起作用的原因

1 1、是springMVC的版本要在4.2或以上版本才支持@CrossOrigin
2 
3 2、非@CrossOrigin沒有解決跨域請求問題,而是不正確的請求導致無法得到預期的響應,導致瀏覽器端提示跨域問題。
4 
5 3、在Controller注解上方添加@CrossOrigin注解后,仍然出現跨域問題,解決方案之一就是:
7   在@RequestMapping注解中沒有指定Get、Post方式,具體指定后,問題解決。

什么是 CSRF 攻擊?

1 CSRF 代表跨站請求偽造。這是一種攻擊,迫使最終用戶在當前通過身份驗證的Web 應用程序上執行不需要的操作。CSRF 攻擊專門針對狀態改變請求,而不是數據竊取,因為攻擊者無法查看對偽造請求的響應。
2 
3 簡單來說就是:攻擊者盜取合法用戶登錄信息,通過盜取賬戶進行登錄,然后以合法用戶的身份發送惡意請求,但是請求對於服務器來說是合法的。

SpringBoot 中的監視器是什么?

1 SpringBoot Actuator是SpringBoot一項重要功能,其可以幫助我們查看應用的運行狀態,對運行時指標進行檢查和監控,監視器提供了一組可以直接作為httpurl訪問的rest端點來訪問查看指定功能狀態。

如何在SpringBoot中禁用Actuator端點安全性?

management.security.enabled=false來禁用安全性

如何監視所有SpringBoot微服務?

 1 創建SpringBoot Web項目,引入下列pom坐標
 2 <dependency>
 3     <groupId>de.codecentric</groupId>
 4     <artifactId>spring-boot-admin-starter-server</artifactId>
 5     <version>2.5.1</version>
 6 </dependency>
 7 <dependency>
 8 
 9 在你的啟動類上添加:@EnableAdminServer注解
10 ===================================
11 
12 在你需要監控的服務中加入下列pom坐標
13 <dependency>
14     <groupId>de.codecentric</groupId>
15     <artifactId>spring-boot-admin-starter-client</artifactId>
16     <version>2.5.1</version>
17 </dependency>
18 
19 在需監控服務中配置:
20 spring.boot.admin.client.url=http://localhost:8080 (監控服務url)
21 management.endpoints.web.exposure.include=*

SpringBoot進階

什么是 WebSockets?

 

什么是 Spring Data?

1 Spring Data 是 Spring 的一個子項目。用於簡化數據庫訪問,支持NoSQL 和 關系數據存儲。其主要目標是使數據庫的訪問變得方便快捷。

什么是 Spring Batch?

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

什么是 FreeMarker 模板?

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

如何集成 SpringBoot和ActiveMQ?

 

Swagger用過麽?他用來做什么?

 

前后端分離,如何維護接口文檔 ?

前后端分離開發日益流行,大部分情況下,我們都是通過 Spring Boot 做前后端分離開發,前后端分離一定會有接口文檔,不然會前后端會深深陷入到扯皮中。
一個比較笨的方法就是使用 word 或者 md 來維護接口文檔,但是效率太低,接口一變,所有人手上的文檔都得變。
在 Spring Boot 中,這個問題常見的解決方案是 Swagger ,使用 Swagger 我們可以快速生成一個接口文檔網站,接口一旦發生變化,文檔就會自動更新,
所有開發工程師訪問這一個在線網站就可以獲取到最新的接口文檔,非常方便。

SpringBoot項目如何熱部署?

1、使用 DEV 工具來實現。DevTools工具可以刷新SpringBoot的更改而無需重啟Tomcat服務器。
  2、Spring Loaded

SpringBoot 中的starter到底是什么 ?

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

spring-boot-starter-parent 有什么用?

1 定義了 Java 編譯版本為 1.82 使用 UTF-8 格式編碼。
3 繼承自 spring-boot-dependencies,這個里邊定義了依賴的版本,也正是因為繼承了這個依賴,所以我們在寫依賴時才不需要寫版本號。
4 執行打包操作的配置。
5 自動化的資源過濾。
6 自動化的插件配置。
7 針對 application.properties 和 application.yml 的資源過濾,包括通過 profile 定義的不同環境的配置文件,例如 application-dev.properties 和 application-dev.yml。

SpringBoot 打成的jar和普通的jar有什么區別 ?

SpringBoot打成jar包可以直接通過java -jar *.jar啟動項目,但是不能夠像普通jar包一樣被其他項目引用。 
普通jar解壓后就是包名,可以直接引用內部的類,而SpringBoot解壓后BOOT/classes目錄下才是真正的代碼,因此不能被直接引用。
如果需要被引用可以配置pom,將SpringBoot打包成兩個jar包,一個可執行,一個可引用。

如何使用SpringBoot實現異常處理?

1、直接在error目錄下防止錯誤頁面
2、@ControllerAdvice+@ExceptionHandler處理全局異常;底層是 ExceptionHandlerExceptionResolver 支持
3、@ResponseStatus+自定義異常 ;底層是 ResponseStatusExceptionResolver ,把responsestatus注解的信息底層調用 response.sendError(statusCode, resolvedReason);tomcat發送的/error

如何使用SpringBoot實現分頁和排序?

 1 1、pom
 2 <!--分頁插件-->
 3             <dependency>
 4                 <groupId>com.github.pagehelper</groupId>
 5                 <artifactId>pagehelper-spring-boot-starter</artifactId>
 6                 <version>${pagehelper-version}</version>
 7             </dependency>
 8 
 9 2、配置文件
10 pagehelper:
11   helper-dialect: mysql
12   reasonable: true
13   support-methods-arguments: true
14   params: count=countSql
15 
16 3、service層
17         //用插件進行分頁
18         PageHelper.startPage(pageNum, pageSize);
19         return articleMapper.findByPage();    
20 
21 4、controller層
22      通過service調用方法后獲取數據。
23      // 需要把Page包裝成PageInfo對象才能序列化。該插件也默認實現了一個PageInfo
24         PageInfo<Article> pageInfo = new PageInfo<>(articles);

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

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

SpringBoot 中如何實現定時任務?

定時任務也是一個常見的需求,SpringBoot 中對於定時任務的支持主要還是來自 Spring 框架。

在 SpringBoot 中使用定時任務主要有兩種不同的方式,一個就是使用 Spring 中的 @Scheduled 注解,另一個則是使用第三方框架 Quartz。
  -使用Spring中的 @Scheduled的方式主要通過@Scheduled注解來實現。
  -使用Quartz,則按照Quartz的方式,定義Job和Trigger即可。

 

提高篇

如何自定義starter?

1、創建項目,創建兩個模塊分別為spring-boot-starter-*,spring-boot-starter-*-autoconfiguration

2、spring-boot-starter-* pom引入spring-boot-starter-*-autoconfiguration

3、spring-boot-starter-*-autoconfiguration創建功能方法,創建*properties類,創建一個配置類將功能方法類添加到spring容器,在resouces下創建META-INF/spring.factories 配置
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration

4、打包安裝這兩個模塊到本地maven倉庫,即可在其他項目引入spring-boot-starter-* 注入功能類進行方法調用

 額外補充

如何在 Spring Boot 啟動的時候運行一些特定的代碼?

可以實現接口 ApplicationRunner 或者 CommandLineRunner,這兩個接口實現方式一樣,它們
都只提供了一個 run 方法

SpringBoot事務的使用

SpringBoot的事物很簡單,首先使用注解EnableTransactionManagement開啟事物之后,然后在
Service方法上添加注解Transactional便可。

Async異步調用方法

在SpringBoot中使用異步調用是很簡單的,只需要在方法上使用@Async注解即可實現方法的異步
調用。 注意:需要在啟動類加入@EnableAsync使異步調用@Async注解生效。

SpringBoot支持什么前端模板

thymeleaf,freemarker,jsp,官方不推薦JSP會有限制

Spring Boot 有哪幾種讀取配置的方式?

Spring Boot 可以通過 @PropertySource,@Value,@Environment, @ConfigurationPropertie注
解來綁定變量

SpringBoot的自動配置原理是什么

1、主要是Spring Boot的啟動類上的核心注解SpringBootApplication注解主配置類,有了這個主配置
   類啟動時就會為SpringBoot開啟一個@EnableAutoConfiguration注解自動配置功能。
2、有了這個EnableAutoConfiguration的話就會:
  1. 從配置文件META_INF/Spring.factories加載可能用到的自動配置類
  2. 去重,並將exclude和excludeName屬性攜帶的類排除
  3. 過濾,將滿足條件(@Conditional)的自動配置類返回

SpringBoot多數據源拆分的思路

先在properties配置文件中配置兩個數據源,創建分包mapper,使用@ConfigurationProperties
讀取properties中的配置,使用@MapperScan注冊到對應的mapper包中

SpringBoot多數據源事務如何管理

第一種方式是在service層的@TransactionManager中使用transactionManager指定
  DataSourceConfig中配置的事務
第二種是使用jta-atomikos實現分布式事務管理

保護 Spring Boot 應用有哪些方法?

在生產中使用HTTPS
使用Snyk檢查你的依賴關系
升級到最新版本
啟用CSRF保護
使用內容安全策略防止XSS攻擊

如何使用 Spring Boot 實現全局異常處理?

Spring 提供了一種使用 ControllerAdvice 處理異常的非常有用的方法。 我們通過實現一個
ControlerAdvice 類,來處理控制器類拋出的所有異常。

SpringBoot性能如何優化

  1. 如果項目比較大,類比較多,不使用@SpringBootApplication,采用@Compoment指定掃包范圍
  2. 在項目啟動時設置JVM初始內存和最大內存相同
  3. 將springboot內置服務器由tomcat設置為undertow

如何重新加載 Spring Boot 上的更改,而無需重新啟動服務器?Spring Boot項目如何熱部署?

<dependency> 
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
</dependency>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM