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,不需要任何強制轉換或基于字串的查找,
- @Configuration:在類上打上寫下此注解,表示這個類是配置類
- @ComponentScan:在配置類上添加 @ComponentScan 注解,該注解默認會掃描該類所在的包下所有的配置類,相當于之前的 <context:component-scan >,
- @Bean:bean的注入:相當于以前的< bean id="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 ,一個可執行,一個可參考,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/541180.html
標籤:其他
