【面試題】Spring/SpringBoot部分[2025/1/6 ~ 2025/1/12]

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, 發布一些時間比如容器啟動事件, 完成啟動

  1. 加載配置文件,初始化容器:Spring 啟動時首先會讀取配置文件(如 XML 配置文件、Java Config 類等),包括配置數據庫連接、事務管理、AOP 配置等。
  2. 實例化容器:Spring 根據配置文件中的信息創建容器 ApplicationContext,在容器啟動階段實例化 BeanFactory,并加載容器中的 BeanDefinitions。
  3. 解析 BeanDefinitions:Spring 容器會解析配置文件中的 BeanDefinitions,即聲明的 Bean 元數據,包括 Bean 的作用域、依賴關系等信息。
  4. 實例化 Bean:Spring 根據 BeanDefinitions 實例化 Bean 對象,將其放入容器管理。
  5. 注入依賴:Spring 進行依賴注入,將 Bean 之間的依賴關系進行注入,包括構造函數注入、屬性注入等。
  6. 處理 Bean 生命周期初始化方法:Spring 調用 Bean 初始化方法(如果有定義的話),對 Bean 進行初始化。 如果 Bean 實現了 InitializingBean 接口,Spring 會調用其 afterPropertiesSet 方法。
  7. 處理 BeanPostProcessors:容器定義了很多 BeanPostProcessor,處理其中的自定義邏輯,例如 postProcessBeforeInitialization 會在 Bean 初始化前調用, postProcessAfterInitialization 則在之后調用。 Spring AOP 代理也在這個階段生成。
  8. 發布事件:Spring 可能會在啟動過程中發布一些事件,比如容器啟動事件。
  9. 完成啟動:當所有 Bean 初始化完畢、依賴注入完成、AOP 配置生效等都準備就緒時,Spring 容器啟動完成。

2. 說說 Springboot 的啟動流程?

  1. 啟動 main() 方法: 應用從 main() 方法啟動,并通過 SpringApplication.run() 引導應用啟動。
  2. 創建SpringApplication: 應用會創建SpringApplication 對象,推斷應用類型、設置初始化器、設置啟動監聽器、確定主應用類。
  3. 準備環境(ConfigurableEnvironment): Spring Boot 在啟動過程中準備應用環境加載配置文件系統環境變量以及命令行參數。
  4. 創建并刷新 ApplicationContext: 創建應用上下文ApplicationContext,加載配置類和自動配置類,注冊 Bean 并執行依賴注入等初始化操作(InitializingBean和BeanPostProcessors)。
  5. 在刷新上下文時啟動嵌入式 Web 服務器: 于 Web 應用,Spring Boot 會自動啟動嵌入式 Web 容器(如 Tomcat),并注冊相關的 Servlet 和 Filter`。
  6. 發布應用已啟動事件: 對應監聽 stated 事件邏輯會被觸發
  7. 執行 CommandLineRunner 和 ApplicationRunner: 在應用啟動完成后,執行實現了 CommandLineRunner 和 ApplicationRunner 接口的初始化邏輯。
  8. 發布 ready 事件、應用啟動完成: 觸發 ApplicationReadyEvent,應用進入運行狀態,處理業務請求或任務。

3. 你了解的 Spring 都用到哪些設計模式?

  1. 工廠模式,從名字就能看出來是 BeanFactory,整個 Spring IOC 就是一個工廠。
  2. 模板方法,例如 JdbcTemplate、RestTemplate,名字是 xxxTemplate 的都是模板。
  3. 代理模式,AOP 整個都是代理模式。
  4. 單例模式,默認情況下 Bean 都是單例的。
  5. 責任鏈模式,比如 Spring MVC 中的攔截器,多個攔截器串聯起來就形成了責任鏈。
  6. 觀察者模式,在 Spring 中的監聽器實現。
  7. 適配器模式,在 Spring MVC 中提到的 handlerAdapter 其實就是適配器。

4. Spring 有哪幾種事務傳播行為?

  1. PROPAGATION_REQUIRED(默認)(有用, 沒有new) 如果當前存在事務,則用當前事務,如果沒有事務則新起一個事務
  2. PROPAGATION_SUPPORTS(有用, 沒有不用) 支持當前事務,如果不存在,則以非事務方式執行
  3. PROPAGATION_NOT_SUPPORTED(不用) 不支持當前事務,始終以非事務方式執行
  4. PROPAGATION_MANDATORY(必須有) 支持當前事務,如果不存在,則拋出異常
  5. PROPAGATION_NEVER(必須沒有) 不支持當前事務,如果當前存在事務,則拋出異常
  6. PROPAGATION_REQUIRES_NEW(始終new) 創建一個新事務,如果存在當前事務,則掛起當前事務
  7. 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 的核心特性有哪些?

  1. 開箱即用,內嵌服務器。這個特點是程序員最直觀的感受,相較于原本的開發,spring boot 可以省略以前繁瑣的 tomcat 配置,快速創建一個 web 容器。
  2. 自動化配置。在 spring boot 中我們可以按照自動配置的規定(將自動加載的 bean 寫在自己jar 包當中的 meta/info/spring.factories 文件中或者通過的注解 @Import 導入時加載指定的類)這樣我們的配置類就會被 Springboot 自動加載到容器當中。 同時還支持通過改寫yaml 和 propreties來覆蓋默認配置
  3. 支持 jar 包運行。傳統部署web 容器都是打成 war 包放在 tomcat 中。spring boot 可以打成 jar 包只要有 java 運行環境即可運行 web 容器。
  4. 監控、健康檢查支持。spring boot Actuator 支持開發者監控應用的運行狀態,包括性能指標、應用信息和日志級別控制等。
  5. 完整的生態支持。spring boot 可以隨意整合 spring 全家桶的支持。像 Actuator 健康檢查模塊,Spring Data JPA 數據庫模塊,Spring Test 測試模塊。這些都可以很優雅的集成在 springboot 當中。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65901.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65901.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65901.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【機器學習:十八、更高級的神經網絡概念】

1. 梯度下降法的改進:Adam算法 1.1 Adam算法簡介 Adam(Adaptive Moment Estimation)是一種優化算法,結合了動量梯度下降和 RMSProp 的優點,在處理稀疏梯度和高維空間優化時表現尤為出色。其核心在于動態調整每個參數…

計算機網絡之---VPN與隧道協議

VPN與隧道協議 VPN(虛擬專用網絡)和隧道協議是現代網絡安全技術的重要組成部分,它們主要用于在不安全的公共網絡(如互聯網)上建立一個安全的私密網絡連接。VPN通過加密通信和認證機制,確保數據的隱私性和完…

【STM32-學習筆記-6-】DMA

文章目錄 DMAⅠ、DMA框圖Ⅱ、DMA基本結構Ⅲ、不同外設的DMA請求Ⅳ、DMA函數Ⅴ、DMA_InitTypeDef結構體參數①、DMA_PeripheralBaseAddr②、DMA_PeripheralDataSize③、DMA_PeripheralInc④、DMA_MemoryBaseAddr⑤、DMA_MemoryDataSize⑥、DMA_MemoryInc⑦、DMA_DIR⑧、DMA_Buff…

SQL Server中可以通過擴展事件來自動抓取阻塞

在SQL Server中可以通過擴展事件來自動抓取阻塞,以下是詳細流程: 開啟阻塞跟蹤配置: ? 執行以下SQL語句來啟用相關配置: EXEC sp_configureshow advanced options, 1; RECONFIGURE; EXEC sp_configure blocked process thresh…

DNS解析域名簡記

域名通常是由: 權威域名.頂級域名.根域名組成的。 從左往右,級別依次升高,這和外國人從小范圍到大范圍的說話習慣相關。(我們自己是更習慣先說大范圍再說小范圍,如XX省XX市XX區XX路) DNS解析域名時,會先查…

【爬蟲】單個網站鏈接爬取文獻數據:標題、摘要、作者等信息

源碼鏈接: https://github.com/Niceeggplant/Single—Site-Crawler.git 一、項目概述 從指定網頁中提取文章關鍵信息的工具。通過輸入文章的 URL,程序將自動抓取網頁內容 二、技術選型與原理 requests 庫:這是 Python 中用于發送 HTTP 請求…

關于掃描模型 拓撲 和 傳遞貼圖工作流筆記

關于MAYA拓撲和傳遞貼圖的操作筆記 一、拓撲低模: 1、拓撲工作區位置: 1、準備出 目標 高模。 (高模的狀態如上 ↑ )。 2、打開頂點吸附,和建模工具區,選擇四邊形繪制. 2、拓撲快捷鍵使…

解決無法遠程管理Windows Server服務器核心安裝

問題 有時,人們會為了節省運算資源,例如運行Hyper-V虛擬機,而選擇Windows Server核心安裝,即無圖形化界面。這時,我們就只能通過Powershell命令對其進行操控,或為了獲得圖形化界面而使用遠程服務器管理工具…

SQL HAVING 子句深入解析

SQL HAVING 子句深入解析 介紹 SQL(Structured Query Language)是一種用于管理關系數據庫管理系統的標準編程語言。在SQL中,HAVING子句是與GROUP BY子句一起使用的,用于篩選分組后的數據。它根據聚合函數的結果對組進行條件過濾…

【計算機網絡】lab7 TCP協議

🌈 個人主頁:十二月的貓-CSDN博客 🔥 系列專欄: 🏀計算機網絡_十二月的貓的博客-CSDN博客 💪🏻 十二月的寒冬阻擋不了春天的腳步,十二點的黑夜遮蔽不住黎明的曙光 目錄 1. 實驗目的…

JavaRestClient 客戶端初始化+索引庫操作

1. 介紹 ES官方提供了各種不同語言的客戶端,用來操作ES。這些客戶端的本質就是組裝DSL語句,通過http請求發送給ES。 Elasticsearch目前最新版本是8.0,其java客戶端有很大變化。不過大多數企業使用的還是8以下版本 2. 客戶端初始化 在elastic…

【JVM-2.2】使用JConsole監控和管理Java應用程序:從入門到精通

在Java應用程序的開發和運維過程中,監控和管理應用程序的性能和資源使用情況是非常重要的。JConsole是Java Development Kit(JDK)自帶的一款圖形化監控工具,它可以幫助開發者實時監控Java應用程序的內存、線程、類加載以及垃圾回收…

基于html5實現音樂錄音播放動畫源碼

源碼介紹 基于html5實現音樂錄音播放動畫源碼是一款類似Shazam的UI,點擊按鈕后,會變成為一個監聽按鈕。旁邊會有音符飛入這個監聽按鈕,最后轉換成一個音樂播放器。 效果預覽 源碼獲取 基于html5實現音樂錄音播放動畫源碼

《自動駕駛與機器人中的SLAM技術》ch1:自動駕駛

目錄 1.1 自動駕駛技術 1.2 自動駕駛中的定位與地圖 1.1 自動駕駛技術 1.2 自動駕駛中的定位與地圖 L2 在技術實現上會更傾向于實時感知,乃至可以使用感知結果直接構建鳥瞰圖(bird eye view, BEV),而 L4 則依賴離線地圖。 高精地…

抖音矩陣是什么

抖音矩陣是指在同一品牌或個人IP下,通過創建多個不同定位的抖音賬號(如主號、副號、子號等),形成一個有機的整體,以實現多維度、多層次的內容覆蓋和用戶互動。以下是關于抖音矩陣的詳細介紹: 抖音矩陣的類…

【開發日記】Docker修改國內鏡像源

1、問題: docker pull鏡像時提示以下內容: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)2、解決 ①…

Centos7 解決Maven scope=system依賴jar包沒有打包到啟動jar包中的問題(OpenCV-4.10)

最近項目中遇到問題,OpenCV的Jar包在程序打包后,找不到相關的類,比如MAT,這個時候懷疑OpenCV_4.10的Jar沒有和應用程序一起打包,后面排查到確實是沒有打包進去,特此記錄,便于日后查閱。 <!-- 加載lib目錄下的opencv包 --> <dependency><groupId>org…

【后端面試總結】Golang可能的內存泄漏場景及應對策略

Golang可能的內存泄漏場景及應對策略 一、引言 Golang作為一種高性能、并發友好的編程語言&#xff0c;其內置的垃圾回收機制極大地簡化了內存管理。然而&#xff0c;這并不意味著開發者可以完全忽視內存泄漏問題。在實際開發中&#xff0c;由于不當的資源管理、循環引用、以…

【LeetCode】:刪除回文子數組【困難】

class Solution { public:// 思考:能否用滾動數組進行優化int minimumMoves(vector<int>& arr) {// 定義狀態dp[i][j]為i-j的最小步數int n arr.size();vector<vector<int>> dp(n, vector<int>(n, 1e9 7));// 可以把這 1 次理解為一種 最小操作單…

ChatGPT入門之文本情緒識別:先了解LSTM如何處理文字序列

文章目錄 0. 首先聊聊什么是RNN1. 理解LSTM&#xff0c;從數據如何喂給 LSTM開始2. LSTM每個門是如何處理序列數據的&#xff1f;2.1 遺忘門&#xff08;Forget Gate&#xff09;&#xff1a;該忘掉哪些信息&#xff1f;2.2 輸入門&#xff08;Input Gate&#xff09;&#xff…