Spring/SpringBoot部分[2025/1/6 ~ 2025/1/12]
- 1. 說說 Spring 啟動過程?
- 2. 說說 Springboot 的啟動流程?
- 3. 你了解的 Spring 都用到哪些設計模式?
- 4. Spring 有哪幾種事務傳播行為?
- 5. SpringBoot 是如何實現自動配置的?
- 6. Spring Boot 是如何通過 main 方法啟動 web 項目的?
- 7. Spring Boot 的核心特性有哪些?
1. 說說 Spring 啟動過程?
首先加載配置文件, 初始化Spring容器ApplicationContext; 掃描Bean定義獲取BeanDefinition; 解析BeanDefinition實例化Bean, 注入依賴, 處理Bean周期初始化方法: InitializingBean和BeanPostProcessor, 發布一些時間比如容器啟動事件, 完成啟動
加載配置文件,初始化容器
:Spring 啟動時首先會讀取配置文件(如 XML 配置文件、Java Config 類等),包括配置數據庫連接、事務管理、AOP 配置等。實例化容器
:Spring 根據配置文件中的信息創建容器 ApplicationContext,在容器啟動階段實例化 BeanFactory,并加載容器中的 BeanDefinitions。解析 BeanDefinitions
:Spring 容器會解析配置文件中的 BeanDefinitions,即聲明的 Bean 元數據,包括 Bean 的作用域、依賴關系等信息。實例化 Bean
:Spring 根據 BeanDefinitions 實例化 Bean 對象,將其放入容器管理。注入依賴
:Spring 進行依賴注入,將 Bean 之間的依賴關系進行注入,包括構造函數注入、屬性注入等。處理 Bean 生命周期初始化方法:
Spring 調用 Bean 初始化方法(如果有定義的話),對 Bean 進行初始化。 如果 Bean 實現了 InitializingBean 接口,Spring 會調用其 afterPropertiesSet 方法。處理 BeanPostProcessors:
容器定義了很多 BeanPostProcessor,處理其中的自定義邏輯,例如 postProcessBeforeInitialization 會在 Bean 初始化前調用, postProcessAfterInitialization 則在之后調用。 Spring AOP 代理也在這個階段生成。發布事件
:Spring 可能會在啟動過程中發布一些事件,比如容器啟動事件。完成啟動
:當所有 Bean 初始化完畢、依賴注入完成、AOP 配置生效等都準備就緒時,Spring 容器啟動完成。
2. 說說 Springboot 的啟動流程?
啟動 main() 方法
: 應用從 main() 方法啟動,并通過 SpringApplication.run() 引導應用啟動。創建SpringApplication
: 應用會創建SpringApplication 對象,推斷應用類型、設置初始化器、設置啟動監聽器、確定主應用類。準備環境(ConfigurableEnvironment)
: Spring Boot 在啟動過程中準備應用環境
,加載配置文件
、系統環境變量
以及命令行參數。創建并刷新 ApplicationContext
: 創建應用上下文ApplicationContext
,加載配置類
和自動配置類,注冊 Bean
并執行依賴注入等初始化操作(InitializingBean和BeanPostProcessors)。- 在刷新上下文時啟動嵌入式 Web 服務器
: 于 Web 應用,Spring Boot 會自動啟動嵌入式 Web 容器(如 Tomcat),并
注冊相關的 Servlet 和 Filter`。 發布應用已啟動事件
: 對應監聽 stated 事件邏輯會被觸發執行 CommandLineRunner 和 ApplicationRunner
: 在應用啟動完成后,執行實現了 CommandLineRunner 和 ApplicationRunner 接口的初始化邏輯。發布 ready 事件、應用啟動完成
: 觸發 ApplicationReadyEvent,應用進入運行狀態,處理業務請求或任務。
3. 你了解的 Spring 都用到哪些設計模式?
- 工廠模式,從名字就能看出來是 BeanFactory,整個 Spring IOC 就是一個工廠。
- 模板方法,例如 JdbcTemplate、RestTemplate,名字是 xxxTemplate 的都是模板。
- 代理模式,AOP 整個都是代理模式。
- 單例模式,默認情況下 Bean 都是單例的。
- 責任鏈模式,比如 Spring MVC 中的攔截器,多個攔截器串聯起來就形成了責任鏈。
- 觀察者模式,在 Spring 中的監聽器實現。
- 適配器模式,在 Spring MVC 中提到的 handlerAdapter 其實就是適配器。
4. Spring 有哪幾種事務傳播行為?
- PROPAGATION_REQUIRED(默認)(
有用, 沒有new
) 如果當前存在事務,則用當前事務,如果沒有事務則新起一個事務 - PROPAGATION_SUPPORTS(
有用, 沒有不用
) 支持當前事務,如果不存在,則以非事務方式執行 - PROPAGATION_NOT_SUPPORTED(
不用
) 不支持當前事務,始終以非事務方式執行 - PROPAGATION_MANDATORY(
必須有
) 支持當前事務,如果不存在,則拋出異常 - PROPAGATION_NEVER(
必須沒有
) 不支持當前事務,如果當前存在事務,則拋出異常 - PROPAGATION_REQUIRES_NEW(
始終new
) 創建一個新事務,如果存在當前事務,則掛起當前事務 - PROPAGATION_NESTED(
嵌套事務
) 如果當前事務存在,則在嵌套事務中執行,內層事務依賴外層事務,如果外層失敗,則會回滾內層,內層失敗不影響外層。
5. SpringBoot 是如何實現自動配置的?
Spring Boot 的自動配置是通過 @EnableAutoConfiguration
注解實現,這個注解包含@Import({AutoConfigurationImportSelector.class})注解,導入的這個類會去掃描 classpath 下所有的 META-INF/spring.factories
中的文件,根據文件中指定的配置類
加載相應的 Bean 的自動配置。 這些 Bean 通常會使用 @ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty 等條件注解。來控制自動配置的加載條件,例如僅在類路徑中存在某個類時,才加載某些配置。
6. Spring Boot 是如何通過 main 方法啟動 web 項目的?
- SpringApplication.run():這是啟動的入口,它會創建 Spring 應用上下文,并執行自動配置。
- 創建應用上下文:為 Web 應用創建 AnnotationConfigServletWebServerApplicationContext 上下文。
- 啟動內嵌 Web 服務器:在 refreshContext() 階段啟動內嵌的 Web 服務器(如 Tomcat)。
- 自動配置:通過 @EnableAutoConfiguration 自動配置各種組件,如 DispatcherServlet。
- 請求處理:內嵌的 DispatcherServlet 負責處理 HTTP 請求。
7. Spring Boot 的核心特性有哪些?
開箱即用,內嵌服務器
。這個特點是程序員最直觀的感受,相較于原本的開發,spring boot 可以省略以前繁瑣的 tomcat 配置,快速創建一個 web 容器。自動化配置
。在 spring boot 中我們可以按照自動配置的規定(將自動加載的 bean 寫在自己jar 包當中的 meta/info/spring.factories 文件中或者通過的注解 @Import 導入時加載指定的類)這樣我們的配置類就會被 Springboot 自動加載到容器當中。 同時還支持通過改寫yaml 和 propreties來覆蓋默認配置支持 jar 包運行
。傳統部署web 容器都是打成 war 包放在 tomcat 中。spring boot 可以打成 jar 包只要有 java 運行環境即可運行 web 容器。監控、健康檢查支持
。spring boot Actuator 支持開發者監控應用的運行狀態,包括性能指標、應用信息和日志級別控制等。完整的生態支持
。spring boot 可以隨意整合 spring 全家桶的支持。像 Actuator 健康檢查模塊,Spring Data JPA 數據庫模塊,Spring Test 測試模塊。這些都可以很優雅的集成在 springboot 當中。