Spring Boot啟動流程

1. 啟動類與main方法

  • 入口點:Spring Boot應用通常有一個帶有@SpringBootApplication注解的主類,并包含一個public static void main(String[] args)方法。
    • @SpringBootApplication是一個組合注解,包含了:
      • @Configuration: 標記該類為配置類。
      • @EnableAutoConfiguration: 自動根據classpath中的依賴進行配置。
      • @ComponentScan: 自動掃描指定包及其子包下的組件(如@Component,?@Service,?@Repository,?@Controller等)。
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

2. 創建SpringApplication實例

  • 構造函數
    • 推斷應用類型:檢查classpath中是否存在特定的類(如Servlet、Reactive相關的類),以確定是Servlet還是Reactive應用。
    • 加載初始器和監聽器:從META-INF/spring.factories文件中加載默認的ApplicationContextInitializerApplicationListener

3.?SpringApplication.run()?方法執行

環境準備
  • 創建并配置Environment:基于命令行參數、系統屬性、環境變量等初始化Environment對象。
    • 可以通過--spring.config.locationSPRING_CONFIG_LOCATION環境變量指定外部配置文件的位置。
  • 觸發事件:發布ApplicationEnvironmentPreparedEvent事件,允許外部工具或開發者自定義環境設置。
    • 可以通過實現ApplicationListener<ApplicationEnvironmentPreparedEvent>來自定義邏輯。
打印Banner
  • 如果啟用了banner,則顯示項目啟動的圖形化標識。
    • 可以通過設置spring.main.banner-modeoff來關閉banner。
創建ApplicationContext
  • 根據應用類型選擇合適的ApplicationContext實現(例如,對于Web應用通常是AnnotationConfigServletWebServerApplicationContext)。
    • 對于非Web應用,可能是AnnotationConfigApplicationContext
加載Sources
  • 將所有指定的source(通常是帶有@Configuration注解的類)注冊到ApplicationContext中。
    • 這包括了自動掃描到的組件和顯式聲明的配置類。
刷新上下文前的準備工作
  • 觸發ApplicationContextInitializedEvent事件。
  • 調用所有的ApplicationContextInitializer進行額外的配置。
    • 這些initializer可以在刷新之前對context進行進一步的定制。

4. ApplicationContext刷新過程

BeanFactory準備
  • 設置bean工廠的各種屬性,包括轉換服務、屬性編輯器等。
    • 配置了諸如PropertyEditorRegistrar等用于處理屬性值轉換的機制。
BeanDefinition加載
  • 掃描classpath:尋找帶有@Component,?@Service,?@Repository,?@Controller等注解的類,并將其注冊為bean definitions。
    • 使用ClassPathScanningCandidateComponentProvider掃描指定包下的組件。
    • 條件注解(如@ConditionalOnClass,?@ConditionalOnMissingBean等)確保僅在滿足特定條件時才生效。
自動配置
  • 自動配置機制:通過@EnableAutoConfiguration觸發自動配置過程。它會根據classpath中的依賴自動配置相應的beans。
    • 自動配置類位于spring-boot-autoconfigure模塊中,它們通過spring.factories文件被發現并加載。
    • 每個自動配置類都可能有條件注解,確保僅在滿足特定條件時才生效。
BeanFactoryPostProcessor執行
  • 處理各種后處理器,如PropertySourcesPlaceholderConfigurer用于解析占位符。
    • 解析${...}形式的屬性值,替換為實際值。
Bean實例化
  • 根據bean definitions實例化單例bean,并進行依賴注入。
    • 初始化bean時,可能還會執行一些生命周期回調方法,如@PostConstruct標注的方法。
    • 如果需要AOP代理,則在此階段生成代理對象。

5. 刷新完成后的工作

  • 觸發ContextRefreshedEvent:表示ApplicationContext已完全刷新。
  • 執行CommandLineRunner/ApplicationRunner beans:如果有任何實現了CommandLineRunnerApplicationRunner接口的beans,它們的方法會被調用。
    • 這些runner可以用來執行最后的初始化操作。

6. 應用就緒

  • 觸發ApplicationReadyEvent:表示應用已經準備好接收請求或執行預定的任務。
  • 開啟web服務器:如果是Web應用,此時嵌入式的Tomcat服務器將會啟動,并開始監聽HTTP請求。

7. 錯誤處理

  • 錯誤處理機制:Spring Boot提供了強大的錯誤處理機制,包括但不限于自定義錯誤頁面、全局異常處理器等,以增強應用的健壯性。
    • 可以通過實現ErrorController來自定義錯誤頁面。
    • 使用@ControllerAdvice@ExceptionHandler來處理全局異常。

額外細節

  • 外部化配置:支持多種方式的外部化配置,如命令行參數、環境變量、properties/yaml文件等。

    • 可以通過application.propertiesapplication.yml文件進行配置。
    • 支持使用@Value注解直接注入配置值。
    • 可以通過spring.profiles.active指定激活的profile,從而加載不同的配置。
  • 健康檢查和度量:通過Actuator模塊提供的端點,可以監控應用的健康狀況和性能指標。

    • 提供了諸如/actuator/health/actuator/metrics等端點。
    • 可以自定義健康指示器(Health Indicator)來擴展健康檢查功能。
  • 日志配置:Spring Boot默認支持多種日志框架,并可以通過簡單的配置定制日志級別和輸出格式。

    • 支持Logback、Log4j2等日志框架,默認使用Logback。
    • 可以通過logging.level.*=DEBUG等配置項調整日志級別。

關鍵技術細節

  • 條件注解:如@ConditionalOnClass,?@ConditionalOnMissingBean等,使得Spring Boot能夠根據當前環境動態地啟用或禁用某些配置。
  • 事件驅動模型:Spring Boot在整個啟動過程中使用了大量的事件發布和監聽機制,這使得開發者可以在應用啟動的不同階段插入自定義邏輯。
    • 例如,可以通過實現ApplicationListener<ApplicationStartedEvent>來自定義啟動邏輯。

示例代碼片段

以下是一個更完整的示例,展示了如何使用Spring Boot的基本結構,并結合了一些高級特性和配置:

@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication app = new SpringApplication(DemoApplication.class);// 關閉bannerapp.setBannerMode(Banner.Mode.OFF);// 添加自定義的ApplicationContextInitializerapp.addInitializers(new MyCustomApplicationContextInitializer());app.run(args);}
}@Component
public class MyCommandLineRunner implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {System.out.println("MyCommandLineRunner executed");}
}@Configuration
public class MyCustomConfig {@Bean@ConditionalOnMissingBean(name = "customBean")public String customBean() {return "This is a custom bean";}
}// 自定義健康檢查
@Component
public class CustomHealthIndicator extends AbstractHealthIndicator {@Overrideprotected void doHealthCheck(Health.Builder builder) throws Exception {builder.up().withDetail("custom", "Everything is OK!");}
}// 全局異常處理器
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(value = Exception.class)public ResponseEntity<Object> exception(Exception exception) {return new ResponseEntity<>("An error occurred: " + exception.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);}
}// 自定義ApplicationContextInitializer
public class MyCustomApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {ConfigurableEnvironment environment = applicationContext.getEnvironment();// 自定義環境配置Map<String, Object> map = new HashMap<>();map.put("my.custom.property", "customValue");environment.getPropertySources().addFirst(new MapPropertySource("customProperties", map));}
}

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

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

相關文章

設計模式——設計模式理念

文章目錄 參考&#xff1a;[設計模式——設計模式理念](https://mp.weixin.qq.com/s/IEduZFF6SaeAthWFFV6zKQ)參考&#xff1a;[設計模式——工廠方法模式](https://mp.weixin.qq.com/s/7tKIPtjvDxDJm4uFnqGsgQ)參考&#xff1a;[設計模式——抽象工廠模式](https://mp.weixin.…

Android 16開發實戰指南|鎖屏交互+Vulkan優化全解析

一、環境搭建與項目初始化 1. 安裝Android Studio Ladybug 下載地址:Android Studio官網關鍵配置: # 安裝后立即更新SDK SDK Manager → SDK Platforms → 安裝Android 16 (Preview) SDK Manager → SDK Tools → 更新Android SDK Build-Tools至34.0.0 # 通過命令行安裝SDK組…

selenium應用測試場景

Selenium 是主流的 Web 自動化測試框架&#xff0c;主要用于基于瀏覽器的 Web 應用測試。以下是 Selenium 的典型測試場景和適用場景&#xff0c;以及與 Appium 的對比&#xff1a; 1. Selenium 的核心測試場景 (1) Web 功能測試&#xff08;Functional Testing&#xff09; 表…

[Vue]生命周期

在編程領域生命周期指的即一個對象從創建到銷毀的過程。 Vue的生命周期大概分為四個階段&#xff1a; 創建階段 在該階段&#xff0c;vue的主要工作是為渲染模板做準備工作。比如處理data中的數據&#xff0c;使其變為響應式數據。在html中普通的數據往往不具備響應式等一系列…

低代碼平臺,智慧城市建設的加速器

隨著城市數字化進程加速&#xff0c;智慧停車、智慧交通、城市數據治理等領域對技術敏捷性和開發效率的需求日益凸顯。低代碼平臺憑借其可視化開發、模塊化設計和快速部署能力&#xff0c;正在成為推動城市治理智能化升級的核心工具。本文將通過低代碼在智慧城市建設上應用的展…

14 配置Hadoop集群-配置歷史和日志服務

第一課時 一、導入 前面的課程我們搭建了hadoop集群&#xff0c;并成功啟動了它&#xff0c;接下來我們看看如何去使用集群。 測試的內容包括&#xff1a;1.上傳文件&#xff0c;2.下載文件&#xff0c;3.運行程序 二、授新 &#xff08;一&#xff09;配置運行任務的歷史服務器…

0102-web架構網站搭建-基礎入門-網絡安全

文章目錄 1. 常規2 站庫分離3 前后端分離4 集成環境5 docker6 分配站結語 1. 常規 結構&#xff1a;源碼數據都在同服務器 影響&#xff1a;無&#xff0c;常規安全測試手法 2 站庫分離 結構&#xff1a;源碼和數據庫不在同服務器 存儲&#xff1a;其他服務器上數據庫或者…

【分布式系統】-2-GFS

MIT的【分布式系統課程】學習記錄 內容純屬個人學習過程中的筆記記錄&#xff0c;如果有侵權現象請留言&#xff0c;會立刻刪除 分布式存儲系統的難點&#xff1a; 設計大型存儲系統的出發點&#xff1a;利用數百臺計算機資源同時完成大量工作&#xff0c;達到性能加成 如何做…

黑盒測試的場景法(能對項目業務進行設計測試點)

定義: 通過運用場景來對系統的功能點或業務流程的描述&#xff0c;設計用例遍歷場景&#xff0c;驗證軟件系統功能的正確性從而提高測試效果的一種方法。 場景法一般包含基本流和備用流。 基本流:軟件功能的正確流程&#xff0c;通常一個業務只存在一個基本流且基本流有一個…

22 安裝第三方包

一、什么是第三方包 在 Python 的世界里&#xff0c;包就像是一個個功能強大的工具箱&#xff0c;它將多個 Python 模塊收納其中&#xff0c;而每個模塊又蘊含著豐富多樣的具體功能。可以說&#xff0c;一個包就是一系列同類功能的集合體&#xff0c;它們就像緊密協作的團隊&a…

MyBatisPlus不等于如何使用

在 MyBatis Plus 中&#xff0c;ne 方法用于構建不等于條件的 SQL 查詢。以下是 ne 方法的詳細用法&#xff1a; 基本用法 ne 方法可以用于 QueryWrapper 或 LambdaQueryWrapper 中&#xff0c;用于指定某個字段的值不等于指定的值。它對應于 SQL 中的 ! 或 <> 操作符。 …

[學術][人工智能] 001_什么是神經網絡?

神經網絡是一種模擬生物神經系統的計算模型&#xff0c;具有廣泛的應用和重要的研究價值。以下將從不同方面詳細介紹神經網絡。 一、神經網絡的發展歷程 20 世紀 60 年代&#xff0c;Hubel 和 Wiesel 在研究貓腦皮層中發現了用于局部敏感和方向選擇的神經元結構&#xff0c;卷積…

Unity3D仿星露谷物語開發32之地面屬性決定角色動作

1、目標 根據地面屬性&#xff08;diggable, canDropItem, canPlaceFurniture, isPath, isNPCObstacle&#xff09;決定角色進行何種操作。比如沒有canDropItem屬性的地面&#xff0c;則不能放置物體。 2、優化保存Item數據 PS&#xff1a;這個是對已有代碼的優化&#xff0…

031-valgrind

valgrind 以下是從原理到代碼實現、參數優化及結果分析的Valgrind技術調研報告&#xff0c;結合C示例和可視化工具使用說明&#xff1a; 一、Valgrind核心原理與架構 1.1 系統架構 #mermaid-svg-xIgV3fg90dGhEEq4 {font-family:"trebuchet ms",verdana,arial,sans-…

C/C++藍橋杯算法真題打卡(Day12)

一、P8752 [藍橋杯 2021 省 B2] 特殊年份 - 洛谷 算法代碼&#xff1a; #include<bits/stdc.h> using namespace std; int cnt;int main() {int i1;while(i<5){int num;cin>>num;string string_numto_string(num);if(string_num[0]string_num[2]&&str…

MySQL 復制與主從架構(Master-Slave)

MySQL 復制與主從架構&#xff08;Master-Slave&#xff09; MySQL 復制與主從架構是數據庫高可用和負載均衡的重要手段。通過復制數據到多個從服務器&#xff0c;既可以實現數據冗余備份&#xff0c;又能分擔查詢壓力&#xff0c;提升系統整體性能與容錯能力。本文將詳細介紹…

《大模型部署》——ollama下載及大模型本地部署(詳細快速部署)

ollama Ollama 是一款開源跨平臺的大語言模型&#xff08;LLM&#xff09;運行工具&#xff0c;旨在簡化本地部署和管理 AI 模型的流程。 下載ollama 進入官網下載https://ollama.com/ 選擇需要的系統下載 下載完成后直接進行安裝 下載大模型 選擇想要部署的模型&#…

Java關于包和final

什么是包&#xff1f; 包就是文件夾。用來管理等各種不同功能的java類&#xff0c;方便后期代碼維護 包名的規則&#xff1a;公司域名反寫包的作用&#xff0c;需要全部英文小寫&#xff0c;見名知意。例如&#xff1a;com.pdsu.domain package com.pdsu.demain;public class…

數據層的基本操作

1.數據層的更名: Arcmap內容列表中,數據框所包含的每個圖層及每個圖層所包含的一系列地理要素,都有相應的描述字符與之對應.默認情況下,添加進地圖的圖層是以其數據源的名字命名的,而地理要素的描述就是要素類型字段取值.由于這些命名影響到用戶對數據的理解和地圖輸出時的圖例…

Vue舞臺劇

Vue 的舞臺劇比喻 &#x1f3ad;&#xff08;完整表格版&#xff09; Vue 結構及路由管理 Vue 結構比喻&#xff08;舞臺劇&#xff09;&#x1f3ad;作用index.html空白場地 &#x1f3df;?Vue 負責填充內容&#xff0c;提供 #app 容器&#xff0c;等待演出開始。main.js導…