分享spring boot 启动流程

2024-12-28  本文已影响0人  wds_94

Spring Boot 启动原理详解

Spring Boot 的启动是一个复杂的流程,从 Main 方法开始,经过一系列步骤,最终完成 Spring 容器的初始化和应用的运行。以下是启动原理的详细解析:


1. 运行 Main 方法


2. 运行 run 方法


3. 读取和解析配置文件


4. 创建 ApplicationContext


5. 预初始化上下文


6. 调用 refresh 方法


7. 创建内置 Servlet 容器


8. 调用监听器和扩展点


9. 源码解析

Main 方法

public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

SpringApplication 的构造


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

调用 run 方法


public ConfigurableApplicationContext run(String... args) {
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    
    ConfigurableApplicationContext context = null;
    try {
        ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
        ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
        Banner printedBanner = printBanner(environment);
        
        context = createApplicationContext();
        prepareContext(context, environment, listeners, applicationArguments, printedBanner);
        refreshContext(context);
        
        afterRefresh(context, applicationArguments);
        stopWatch.stop();
    } catch (Throwable ex) {
        handleRunFailure(context, ex, listeners);
        throw new IllegalStateException(ex);
    }
    return context;
}

创建内置 Servlet 容器

protected void onRefresh() {
    super.onRefresh();
    try {
        createWebServer();
    } catch (Throwable ex) {
        throw new ApplicationContextException("Unable to start web server", ex);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读