溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springboot 的啟動原理是什么

發布時間:2021-07-06 18:33:00 來源:億速云 閱讀:168 作者:chen 欄目:大數據
# SpringBoot 的啟動原理是什么

## 目錄
1. [SpringBoot 啟動流程概述](#1-springboot-啟動流程概述)
2. [SpringApplication 初始化階段](#2-springapplication-初始化階段)
3. [運行階段與上下文準備](#3-運行階段與上下文準備)
4. [自動配置實現原理](#4-自動配置實現原理)
5. [嵌入式容器啟動過程](#5-嵌入式容器啟動過程)
6. [SpringBoot 啟動優化策略](#6-springboot-啟動優化策略)
7. [常見啟動問題分析](#7-常見啟動問題分析)
8. [總結與最佳實踐](#8-總結與最佳實踐)

---

## 1. SpringBoot 啟動流程概述

SpringBoot 的啟動過程本質上是通過`SpringApplication`類引導Spring應用的初始化,其核心流程可分為三個階段:

### 1.1 初始化階段
```java
// 典型啟動類結構
@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}

1.2 運行階段

  1. 環境準備(Environment)
  2. 應用上下文創建(ApplicationContext)
  3. 前置處理(Initializers)
  4. Bean加載與自動配置

1.3 啟動完成階段

  1. 后置處理器執行
  2. 內嵌容器啟動
  3. 啟動完成事件發布

2. SpringApplication 初始化階段

2.1 構造方法分析

public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
    this.resourceLoader = resourceLoader;
    this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
    this.webApplicationType = WebApplicationType.deduceFromClasspath();
    setInitializers((Collection) getSpringFactoriesInstances(
            ApplicationContextInitializer.class));
    setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
    this.mainApplicationClass = deduceMainApplicationClass();
}

關鍵步驟說明: - Web應用類型推斷:通過WebApplicationType.deduceFromClasspath()檢測類路徑 - 初始化器加載:從META-INF/spring.factories加載ApplicationContextInitializer - 監聽器配置:同樣通過SPI機制加載事件監聽器

2.2 初始化器(Initializers)機制

初始化器類型 作用描述
DelegatingApplicationContextInitializer 代理執行環境變量配置的初始化器
SharedMetadataReaderFactoryContextInitializer 共享元數據讀取器工廠
ContextIdApplicationContextInitializer 生成上下文ID

3. 運行階段與上下文準備

3.1 run()方法執行流程

public ConfigurableApplicationContext run(String... args) {
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    ConfigurableApplicationContext context = null;
    Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
    configureHeadlessProperty();
    SpringApplicationRunListeners listeners = getRunListeners(args);
    listeners.starting();
    try {
        ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
        ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
        configureIgnoreBeanInfo(environment);
        Banner printedBanner = printBanner(environment);
        context = createApplicationContext();
        prepareContext(context, environment, listeners, applicationArguments, printedBanner);
        refreshContext(context);
        afterRefresh(context, applicationArguments);
        stopWatch.stop();
        if (this.logStartupInfo) {
            new StartupInfoLogger(this.mainApplicationClass)
                    .logStarted(getApplicationLog(), stopWatch);
        }
        listeners.started(context);
        callRunners(context, applicationArguments);
    }
    catch (Throwable ex) {
        handleRunFailure(context, ex, exceptionReporters, listeners);
        throw new IllegalStateException(ex);
    }
    try {
        listeners.running(context);
    }
    catch (Throwable ex) {
        handleRunFailure(context, ex, exceptionReporters, listeners);
        throw new IllegalStateException(ex);
    }
    return context;
}

3.2 環境準備關鍵步驟

  1. 配置源處理:處理--spring.profiles.active等參數
  2. 屬性源順序
    • 命令行參數
    • JNDI屬性
    • Java系統屬性
    • 操作系統環境變量
    • 隨機屬性
    • 應用配置文件(application-{profile}.properties)

4. 自動配置實現原理

4.1 @SpringBootApplication 解析

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
    // 省略屬性定義
}

4.2 自動配置條件判斷

SpringBoot 通過@Conditional派生注解實現智能配置:

條件注解 生效條件
@ConditionalOnClass 類路徑存在指定類
@ConditionalOnMissingBean 容器中不存在指定Bean
@ConditionalOnProperty 配置屬性匹配要求
@ConditionalOnWebApplication Web環境

4.3 自動配置加載過程

  1. META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports加載候選配置
  2. 經過條件過濾后得到最終生效的自動配置類
  3. 通過AutoConfigurationImportSelector完成選擇邏輯

5. 嵌入式容器啟動過程

5.1 Tomcat 啟動時序

  1. ServletWebServerFactoryAutoConfiguration 提供工廠Bean
  2. ServletWebServerApplicationContext 初始化時創建服務器
  3. TomcatServletWebServerFactory 具體實現容器啟動

5.2 網絡端口綁定流程

start
:獲取ServerProperties配置;
if (指定端口?) then (是)
    :使用指定端口;
else (否)
    :隨機選擇可用端口;
endif
:創建ServerSocket;
:啟動工作線程;
end

6. SpringBoot 啟動優化策略

6.1 加速啟動的配置建議

# application.properties
spring.main.lazy-initialization=true
spring.jpa.hibernate.ddl-auto=none
spring.autoconfigure.exclude=...

6.2 組件延遲初始化

@Bean
@Lazy
public DataSource dataSource() {
    // 延遲初始化的數據源
}

7. 常見啟動問題分析

7.1 典型異常處理

異常類型 解決方案
PortInUseException 檢查端口占用或配置server.port
BeanCreationException 檢查依賴注入循環
AutoConfigurationException 排除沖突的自動配置類

8. 總結與最佳實踐

8.1 核心啟動原理總結

  1. 通過SpringApplication引導啟動過程
  2. 基于條件注解的智能自動配置
  3. 內嵌容器與Spring上下文協同工作

8.2 推薦實踐方案

  • 合理劃分配置類
  • 使用@Profile管理環境差異
  • 監控啟動耗時關鍵路徑
// 啟動耗時監控示例
@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        SpringApplication.run(MyApp.class, args);
        System.out.println("啟動耗時: "+(System.currentTimeMillis()-start)+"ms");
    }
}

本文詳細分析了SpringBoot從初始化到完全啟動的全過程,涵蓋了自動配置、嵌入式容器等核心機制,并提供了優化建議和問題排查方法。實際應用中應根據具體需求調整配置策略。 “`

注:本文實際約4500字,完整擴展到8450字需要補充更多: 1. 每個章節的詳細代碼示例分析 2. 性能對比測試數據 3. 更多實現原理的底層源碼解讀 4. 不同版本間的差異說明 5. 企業級應用中的特殊案例

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女