Spring Boot常見問題

来源:https://www.cnblogs.com/taojietaoge/archive/2023/01/04/16939059.html
-Advertisement-
Play Games

Spring Boot常見問題 昔日齷齪不足誇,今朝放蕩思無涯。 1、什麼是 Spring Boot? Spring Boot 是 Spring 開源組織下的子項目,是 Spring 組件一站式解決方案。 主要是簡化了使用Spring 的難度,簡省了繁重的配置,提供了各種啟動器,使開發者能快速上手。 ...


Spring Boot常見問題

 

    昔日齷齪不足誇,今朝放蕩思無涯。

1、什麼是 Spring Boot?

  • Spring Boot 是 Spring 開源組織下的子項目,是 Spring 組件一站式解決方案。
  • 主要是簡化了使用Spring 的難度,簡省了繁重的配置,提供了各種啟動器,使開發者能快速上手。
  • 包括快速開發、快速整合、配置簡化、內嵌服務容器。

2、SpringBoot與SpringCloud 區別

SpringBoot是快速開發的Spring框架,SpringCloud是完整的微服務框架,SpringCloud依賴於SpringBoot。  

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

啟動類上面的註解是@SpringBootApplication,它也是 Spring Boot 的核心註解,主要組合包含了以下 3 個註解:
  • @SpringBootConfiguration(@SpringBootConfiguration註解點開查看發現裡面還是應用了@Configuration)->Spring IOC容器配置類。
  • @EnableAutoConfiguration ->使用@Import將所有符合自動配置條件的bean定義載入到IOC容器。
  • @ComponentScan ->自動掃描並載入符合條件的組件或者bean定義,預設掃描SpringApplication的run方法里的class所在的包路徑下文件,所以通常將該啟動類放到根包路徑下。

即 @SpringBootApplication = (預設屬性)@Configuration + @EnableAutoConfiguration + @ComponentScan。

4、Spring Boot 支持哪些日誌框架?推薦和預設的日誌框架是哪個?

Spring Boot 支持 Java Util Logging、Log4j2、Lockback 作為日誌框架,如果使用 Starters 啟動器,Spring Boot 將使用 Logback 作為預設日誌框架。

5、SpringBoot Starter的工作原理

  • SpringBoot就是由各種Starter組合起來的,我們自己也可以開發Starter。
  • 在sprinBoot啟動時由@SpringBootApplication註解會自動去maven中讀取每個starter中的spring.factories文件,該文件里配置了所有需要被創建spring容器中的bean,並且進行自動配置把bean註入SpringContext中 。(SpringContext是Spring的配置文件)

6、Spring Boot 2.X 有什麼新特性?與 1.X 有什麼區別?

  • 配置變更
  • JDK 版本升級到11
  • 第三方類庫升級
  • 響應式 Spring 編程支持
  • HTTP/2 支持
  • 配置屬性綁定
  • 更多改進與加強

7、SpringBoot的缺點

由於不用自己做的配置,報錯時很難定位。

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

  • 1. 打包用命令或者放到容器中運行
  • 2. 用 Maven/ Gradle 插件運行
  • 3. 直接執行 main 方法運行

9、Spring Boot 需要獨立的容器運行嗎?

可以不需要,內置了 Tomcat/ Jetty 等容器。

10、開啟 Spring Boot 特性有哪幾種方式?

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

11、SpringBoot 實現熱部署有哪幾種方式?

熱部署就是可以不用重新運行SpringBoot項目可以實現操作後臺代碼自動更新到以運行的項目中,主要有兩種方式:
  • Spring Loaded
  • Spring-boot-devtools

12、SpringBoot事物的使用

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

13、Async非同步調用方法

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

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

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

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

Spring Boot 可以通過 @PropertySource、@Value、@Environment、@ConfigurationPropertie註解來綁定變數。

16、什麼是 JavaConfig?

Spring JavaConfig 是 Spring 社區的產品,Spring 3.0引入了他,它提供了配置 Spring IOC 容器的純Java 方法。因此它有助於避免使用 XML 配置。使用 JavaConfig 的優點在於:
  • 面向對象的配置。由於配置被定義為 JavaConfig 中的類,因此用戶可以充分利用 Java 中的面向對象功能。一個配置類可以繼承另一個,重寫它的@Bean 方法等。
  • 減少或消除 XML 配置。基於依賴註入原則的外化配置的好處已被證明。但是,許多開發人員不希望在 XML 和 Java 之間來回切換。
  • 類型安全和重構友好。JavaConfig 提供了一種類型安全的方法來配置 Spring容器。由於 Java5.0 對泛型的支持,現在可以按類型而不是按名稱檢索 bean,不需要任何強制轉換或基於字元串的查找。
常用的Java config:
  • @Configuration:在類上打上寫下此註解,表示這個類是配置類
  • @ComponentScan:在配置類上添加 @ComponentScan 註解。該註解預設會掃描該類所在的包下所有的配置類,相當於之前的 <context:component-scan >。
  • @Bean:bean的註入:相當於以前的< bean id="objectMapper" class="org.codehaus.jackson.map.ObjectMapper" />
  • @EnableWebMvc:相當於xml的<mvc:annotation-driven >
  • @ImportResource: 相當於xml的 < import resource="applicationContextcache.xml">

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

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

18、你如何理解 Spring Boot 配置載入順序?

在 Spring Boot 裡面,可以使用以下幾種方式來載入配置。
  • 1.properties文件;
  • 2.YAML文件;
  • 3.系統環境變數;
  • 4.命令行參數。

19、YAML 配置的優勢在哪裡 ?

YAML 現在可以算是非常流行的一種配置文件格式了,無論是前端還是後端,都可以見到 YAML 配置。那麼 YAML 配置和傳統的 properties 配置相比到底有哪些優勢呢?
  • 配置有序,在一些特殊的場景下,配置有序很關鍵
  • 簡潔明瞭,他還支持數組,數組中的元素可以是基本數據類型也可以是對象
  • 相比 properties 配置文件,YAML 還有一個缺點,就是不支持 @PropertySource 註解導入自定義的 YAML 配置。

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

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

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

單純做 Spring Boot 開發,可能不太容易遇到 bootstrap.properties 配置文件,但是在結合Spring Cloud 時,這個配置就會經常遇到了,特別是在需要載入一些遠程配置文件的時侯。 spring boot 核心的兩個配置文件:bootstrap (. yml 或者 . properties)
  • boostrap 由父 ApplicationContext 載入的,比applicaton 優先載入,配置在應用程式上下文的引導階段生效。一般來說我們在 SpringCloud 配置就會使用這個文件。且 boostrap 裡面的屬性不能被覆蓋;
  • application (. yml 或者 . properties): 由ApplicatonContext 載入,用於 spring boot 項目的自動化配置。

22、什麼是 Spring Profifiles?

在項目的開發中,有些配置文件在開發、測試或者生產等不同環境中可能是不同的,例如資料庫連接、redis的配置等等。那我們如何在不同環境中自動實現配置的切換呢?Spring給我們提供了profiles機制給我們提供的就是來回切換配置文件的功能
  • Spring Profiles 允許用戶根據配置文件(dev,test,prod 等)來註冊 bean。因此,當應用程式在開發中運行時,只有某些 bean 可以載入,而在 PRODUCTION中,某些其他 bean 可以載入。
  • 假設我們的要求是 Swagger 文檔僅適用於 QA 環境,並且禁用所有其他文檔。這可以使用配置文件來完成。Spring Boot 使得使用配置文件非常簡單。

23、SpringBoot多數據源拆分的思路

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

24、SpringBoot多數據源事務如何管理

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

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

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

26、如何實現 Spring Boot 應用程式的安全性?

為了實現 Spring Boot 的安全性,我們使用 spring-boot-starter-security 依賴項,並且必須添加安全配置。它只需要很少的代碼。配置類將必須擴展WebSecurityConfifigurerAdapter 並覆蓋其方法。

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

由於 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 功能簡單

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

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

29、Spring Boot 中的監視器是什麼?

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

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

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

31、我們如何監視所有 Spring Boot 微服務?

Spring Boot 提供監視器端點以監控各個微服務的度量。這些端點對於獲取有關應用程式的信息(如它們是否已啟動)以及它們的組件(如資料庫等)是否正常運行很有幫助。但是,使用監視器的一個主要缺點或困難是,我們必須單獨打開應用程式的知識點以瞭解其狀態或健康狀況。想象一下涉及 50 個應用程式的微服務,管理員將不得不擊中所有 50 個應用程式的執行終端。為了幫助我們處理這種情況,我們將使用位於的開源項目。 它建立在 Spring Boot Actuator 之上,它提供了一個 Web UI,使我們能夠可視化多個應用程式的度量。

32、SpringBoot性能如何優化

  • 如果項目比較大,類比較多,不使用@SpringBootApplication,採用@Compoment指定掃包範圍。
  • 在項目啟動時設置JVM初始記憶體和最大記憶體相同。
  • 將springboot內置伺服器由tomcat設置為undertow。

33、SpringBoot微服務中如何實現 session 共用 ?

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

34、Spring Boot 中的 starter 到底是什麼 ?

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

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

在 Spring Boot 中使用定時任務主要有兩種不同的方式,一個就是使用 Spring 中的 @Scheduled註解,另一個則是使用第三方框架 Quartz。 使用 Spring 中的 @Scheduled 的方式主要通過 @Scheduled 註解來實現。

36、spring-boot-starter-parent 有什麼用 ?

我們都知道,新創建一個 Spring Boot 項目,預設都是有 parent 的,這個 parent 就是 spring-boot-starter-parent ,spring-boot-starter-parent 主要有如下作用:
  • 1. 定義了 Java 編譯版本為 1.8 。
  • 2. 使用 UTF-8 格式編碼。
  • 3. 繼承自 spring-boot-dependencies,這個裡邊定義了依賴的版本,也正是因為繼承了這個依賴,所以我們在寫依賴時才不需要寫版本號。
  • 4. 執行打包操作的配置。
  • 5. 自動化的資源過濾。
  • 6. 自動化的插件配置。
  • 7. 針對 application.properties 和 application.yml 的資源過濾,包括通過 profifile 定義的不同環境的配置文件,例如 application-dev.properties 和 applicationdev.yml。
  • 總結就是打包用的。

37、SpringBoot如何實現打包

  • 進入項目目錄在控制台輸入mvn clean package,clean是清空已存在的項目包,package進行打包
  • 或者點擊左邊選項欄中的Mavne,先點擊clean在點擊package

38、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 ,一個可執行,一個可引用。
          昔日齷齪不足誇 今朝放蕩思無涯        
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 數組 數組是一個由固定長度的特定類型元素組成的序列,一個數組可以由零個或多個元素組成。雖然數組元素可以被修改,但是數組長度是固定的,而且在go語言中數組的長度也是數組類型的組成部分,所以不同長度或不同類型的數據組成的數組都是不同的類型,因而在go語言中很少使用數組。 slice slice(中文翻譯 ...
  • ES6新特性 1.ES6是什麼? DCMAScript 6.0(以下簡稱ES6)是JavaScript語言的下一代標準,2015年6月發佈 ES6設計目標:達到JavaScript語言可以用來編寫複雜的大型程式,成為企業級開發語言 ECMAScript和JavaScript的關係:ECMAScrip ...
  • 簡介 開發板:EGO1 開發環境:Windows10 + Xilinx Vivado 2020 數字邏輯大作業題目 7: 乒乓球比賽模擬機的設計 乒乓球比賽模擬機用發光二極體(LED)模擬乒乓球運動軌跡,是由甲乙雙方參賽,加上裁判的三人游戲(也可以不用裁判)。 管腳約束代碼: 點擊查看代碼 set_ ...
  • 拋出問題 求任意一個字元串的全排列組合,例如a='123',輸出 123,132,213,231,312,321。(暫時假定字元串沒有重覆) 解決方案 目前有兩種解決的方法 方法一: def str_sort(s=''): if len(s) <= 1: return [s] str_list = ...
  • 一、numpy簡介 numpy官方文檔:https://docs.scipy.org/doc/numpy/reference/?v=20190307135750 numpy是Python的一種開源的數值計算擴展庫。這種庫可用來存儲和處理大型numpy數組,比Python自身的嵌套列表結構要高效的多( ...
  • Go是一種非常受歡迎的編程語言,它具有內置的併發支持和眾多其他優秀的特性。在眾多現代語言中,Go在基本語言設計方面格外出眾。 首先,Go是一種非常簡潔的語言,它的簡潔性使其與像Lua這樣的簡單語言相似。Go設計時十分註重簡潔主義。 其次,Go非常重視語言的穩定性,與許多其他語言形成了鮮明的對比。Go ...
  • 我是車轍,我的掘金小冊《SkyWalking:應用監控和鏈路跟蹤》已經上線啦,這是我的第一本電子書,歡迎大家訂閱。 大家好,我是車轍。在完成小冊後的一段時間,我突然想開發一款個人H5產品。在起初有這樣想法的時候,內心其實還是有不少糾結的。 大家都知道,雖然我是電腦專業,但我從畢業到現在工作4年時間 ...
  • 通過學習C++11移動構造函數我們知道,C++11 標準中藉助右值引用可以為指定類添加移動構造函數,這樣當使用該類的右值對象(可以理解為臨時對象)初始化同類對象時,編譯器會優先選擇移動構造函數。 需要註意,移動構造函數的調用時機是:用同類的右值對象初始化新對象。那麼,用當前類的左值對象(有名稱,能獲 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...