Spring Boot常見問題
昔日齷齪不足誇,今朝放蕩思無涯。
1、什麼是 Spring Boot?
- Spring Boot 是 Spring 開源組織下的子項目,是 Spring 組件一站式解決方案。
- 主要是簡化了使用Spring 的難度,簡省了繁重的配置,提供了各種啓動器,使開發者能快速上手。
- 包括快速開發、快速整合、配置簡化、內嵌服務容器。
2、SpringBoot與SpringCloud 區別
3、Spring Boot 的核心註解是哪個?它主要由哪幾個註解組成的?
- @SpringBootConfiguration(@SpringBootConfiguration註解點開查看發現裏面還是應用了@Configuration)->Spring IOC容器配置類。
- @EnableAutoConfiguration ->使用@Import將所有符合自動配置條件的bean定義加載到IOC容器。
- @ComponentScan ->自動掃描並加載符合條件的組件或者bean定義,默認掃描SpringApplication的run方法裏的class所在的包路徑下文件,所以通常將該啓動類放到根包路徑下。
即 @SpringBootApplication = (默認屬性)@Configuration + @EnableAutoConfiguration + @ComponentScan。
4、Spring Boot 支持哪些日誌框架?推薦和默認的日誌框架是哪個?
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 需要獨立的容器運行嗎?
10、開啓 Spring Boot 特性有哪幾種方式?
- 1. 繼承spring-boot-starter-parent項目
- 2. 導入spring-boot-dependencies項目依賴
11、SpringBoot 實現熱部署有哪幾種方式?
- Spring Loaded
- Spring-boot-devtools
12、SpringBoot事物的使用
13、Async異步調用方法
- 在SpringBoot中使用異步調用是很簡單的,只需要在方法上使用 @Async 註解即可實現方法的異步調用。
- 注意:需要在啓動類加入 @EnableAsync 使異步調用 @Async 註解生效。
14、如何在 Spring Boot 啓動的時候運行一些特定的代碼?
15、Spring Boot 有哪幾種讀取配置的方式?
16、什麼是 JavaConfig?
- 面向對象的配置。由於配置被定義爲 JavaConfig 中的類,因此用戶可以充分利用 Java 中的面向對象功能。一個配置類可以繼承另一個,重寫它的@Bean 方法等。
- 減少或消除 XML 配置。基於依賴注入原則的外化配置的好處已被證明。但是,許多開發人員不希望在 XML 和 Java 之間來回切換。
- 類型安全和重構友好。JavaConfig 提供了一種類型安全的方法來配置 Spring容器。由於 Java5.0 對泛型的支持,現在可以按類型而不是按名稱檢索 bean,不需要任何強制轉換或基於字符串的查找。
- @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的自動配置原理是什麼
- 1. 從配置文件META_INF/Spring.factories加載可能用到的自動配置類
- 2. 去重,並將exclude和excludeName屬性攜帶的類排除
- 3. 過濾,將滿足條件(@Conditional)的自動配置類返回
18、你如何理解 Spring Boot 配置加載順序?
- 1.properties文件;
- 2.YAML文件;
- 3.系統環境變量;
- 4.命令行參數。
19、YAML 配置的優勢在哪裏 ?
- 配置有序,在一些特殊的場景下,配置有序很關鍵
- 簡潔明瞭,他還支持數組,數組中的元素可以是基本數據類型也可以是對象
- 相比 properties 配置文件,YAML 還有一個缺點,就是不支持 @PropertySource 註解導入自定義的 YAML 配置。
20、Spring Boot 是否可以使用 XML 配置 ?
21、spring boot 核心配置文件是什麼?bootstrap.properties 和application.properties 有何區別 ?
- boostrap 由父 ApplicationContext 加載的,比applicaton 優先加載,配置在應用程序上下文的引導階段生效。一般來說我們在 SpringCloud 配置就會使用這個文件。且 boostrap 裏面的屬性不能被覆蓋;
- application (. yml 或者 . properties): 由ApplicatonContext 加載,用於 spring boot 項目的自動化配置。
22、什麼是 Spring Profifiles?
- Spring Profiles 允許用戶根據配置文件(dev,test,prod 等)來註冊 bean。因此,當應用程序在開發中運行時,只有某些 bean 可以加載,而在 PRODUCTION中,某些其他 bean 可以加載。
- 假設我們的要求是 Swagger 文檔僅適用於 QA 環境,並且禁用所有其他文檔。這可以使用配置文件來完成。Spring Boot 使得使用配置文件非常簡單。
23、SpringBoot多數據源拆分的思路
24、SpringBoot多數據源事務如何管理
- 第一種方式是在service層的@TransactionManager中使用transactionManager指定DataSourceConfig中配置的事務
- 第二種是使用jta-atomikos實現分佈式事務管理
25、保護 Spring Boot 應用有哪些方法?
- 在生產中使用HTTPS
- 使用Snyk檢查你的依賴關係
- 升級到最新版本
- 啓用CSRF保護
- 使用內容安全策略防止XSS攻擊
26、如何實現 Spring Boot 應用程序的安全性?
27、比較一下 Spring Security 和 Shiro 各自的優缺點 ?
- Spring Security 是一個重量級的安全管理框架;Shiro 則是一個輕量級的安全管理框架
- Spring Security 概念複雜,配置繁瑣;Shiro 概念簡單、配置簡單
- Spring Security 功能強大;Shiro 功能簡單
28、Spring Boot 中如何解決跨域問題 ?
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 中的監視器是什麼?
30、如何使用 Spring Boot 實現全局異常處理?
31、我們如何監視所有 Spring Boot 微服務?
32、SpringBoot性能如何優化
- 如果項目比較大,類比較多,不使用@SpringBootApplication,採用@Compoment指定掃包範圍。
- 在項目啓動時設置JVM初始內存和最大內存相同。
- 將springboot內置服務器由tomcat設置爲undertow。
33、SpringBoot微服務中如何實現 session 共享 ?
34、Spring Boot 中的 starter 到底是什麼 ?
35、Spring Boot 中如何實現定時任務 ?
36、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 ,一個可執行,一個可引用。