91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

SpringBoot啟動流程是什么

發布時間:2023-05-05 15:37:49 來源:億速云 閱讀:148 作者:iii 欄目:開發技術

本篇內容主要講解“SpringBoot啟動流程是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“SpringBoot啟動流程是什么”吧!

SpringBoot啟動過程簡介

SpringBoot應用程序的啟動過程可以分為以下幾個步驟:

  • 加載應用程序上下文

  • 掃描應用程序中的所有組件

  • 自動配置應用程序環境

  • 啟動嵌入式Web服務器

加載應用程序上下文

SpringBoot 應用程序的上下文是一個包含所有應用程序組件的容器。在啟動過程中,SpringBoot 會加載并初始化這個容器。

這個步驟的源代碼在SpringApplication類中。具體來說,SpringApplication類的run方法是這個過程的入口點。在這個方法中,Spring Boot會通過調用createApplicationContext方法來創建應用程序上下文。

下面是createApplicationContext方法的源代碼:

protected ConfigurableApplicationContext createApplicationContext() {
    Class<?> contextClass = this.applicationContextClass;
    if (contextClass == null) {
        try {
            switch (this.webApplicationType) {
                case SERVLET:
                    contextClass = Class.forName(DEFAULT_SERVLET_WEB_CONTEXT_CLASS);
                    break;
                case REACTIVE:
                    contextClass = Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS);
                    break;
                default:
                    contextClass = Class.forName(DEFAULT_CONTEXT_CLASS);
            }
        }
        catch (ClassNotFoundException ex) {
            throw new IllegalStateException(
                    "Unable to create a default ApplicationContext, " +
                    "please specify an ApplicationContextClass", ex);
        }
    }
    return (ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass);
}

在這個方法中,SpringBoot 會根據應用程序類型(Servlet或Reactive)選擇合適的上下文類。然后,它會使用 Java 反射機制來實例化這個類并返回一個可配置的應用程序上下文對象。

掃描應用程序中的所有組件

在上一步中,SpringBoot創建了應用程序上下文。在這一步中,SpringBoot會掃描應用程序中的所有組件并將它們注冊到應用程序上下文中。

這個步驟的源代碼在SpringApplication類中的scan方法中。具體來說,在這個方法中,SpringBoot 會創建一個SpringBootBeanDefinitionScanner對象,并使用它來掃描應用程序中的所有組件。

下面是scan方法的源代碼:

private void scan(String... basePackages) {
    if (ObjectUtils.isEmpty(basePackages)) {
        return;
    }
    ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(
            this.includeFilters, this.excludeFilters, this.resourceLoader);
    scanner.setResourceLoader(this.resourceLoader);
    scanner.setEnvironment(this.environment);
    scanner.setIncludeAnnotationConfig(this.useAnnotatedConfig);
    scanner.addExcludeFilter(new AbstractTypeHierarchyTraversingFilter(false, false) {
        @Override
        protected boolean matchClassName(String className) {
            return getExcludeClassNames().contains(className);
        }
    });
    for (String basePackage : basePackages) {
        scanner.findCandidateComponents(basePackage).forEach(this.componentDefinitions::add);
    }
}

在這個方法中,SpringBoot 會創建一個ClassPathScanningCandidateComponentProvider對象,并使用它來掃描應用程序中的所有組件。這個對象會掃描指定包路徑下的所有類,并將它們轉換為 Spring 的 Bean 定義。這些 Bean 定義將被注冊到應用程序上下文中。

自動配置應用程序環境

在上一步中,SpringBoot將應用程序中的所有組件注冊到應用程序上下文中。在這一步中,SpringBoot將自動配置應用程序環境,包括配置數據源、事務管理器、JPA等。

這個步驟的源代碼在SpringApplication類中的configureEnvironment方法中。在這個方法中,Spring Boot會創建一個SpringApplicationRunListeners對象,并使用它來配置應用程序環境。

下面是configureEnvironment方法的源代碼:

private void configureEnvironment(ConfigurableEnvironment environment, String[] args) {
    if (this.addCommandLineProperties) {
        ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
        environment.getPropertySources().addLast(new CommandLinePropertySource(applicationArguments));
    }
    this.listeners.environmentPrepared(environment);
    if (this.logStartupInfo) {
        this.logStartupInfo(environment);
    }
    ConfigurationPropertySources.attach(environment);
    Binder.get(environment).bind(ConfigurationPropertyName.EMPTY, Bindable.ofInstance(this.sources));
    if (!this.isCustomEnvironment) {
        EnvironmentConverter.configureEnvironment(environment, this.deduceEnvironmentClass());
    }
    this.listeners.environmentPrepared(environment);
}

在這個方法中,SpringBoot 會創建一個ApplicationArguments對象,并將其轉換為一個命令行屬性源。然后,它會調用listeners中的environmentPrepared方法來通知應用程序環境已經準備好了。隨后,SpringBoot 會綁定屬性源到應用程序環境中,并調用listeners中的environmentPrepared方法來通知應用程序環境已經準備好了。

啟動嵌入式Web服務器

在上一步中,SpringBoot 將應用程序環境自動配置完成。在這一步中,SpringBoot 將啟動嵌入式Web服務器,以便應用程序能夠提供 Web 服務。

這個步驟的源代碼在SpringApplication類中的run方法中。具體來說,在這個方法中,SpringBoot 會根據應用程序類型(Servlet或Reactive)選擇合適的嵌入式Web服務器,并使用它來啟動應用程序。

下面是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();
        exceptionReporters = getSpringFactoriesInstances(
                SpringBootExceptionReporter.class,
                new Class[] { ConfigurableApplicationContext.class }, context);
        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, null);
        throw new IllegalStateException(ex);
    }
    return context;
}

在這個方法中,SpringBoot 會使用一個StopWatch對象來計算應用程序啟動時間。然后,它會調用listeners中的starting方法來通知應用程序即將啟動。接著,SpringBoot 會準備應用程序環境,并使用它來創建應用程序上下文。隨后,SpringBoot 會調用listeners中的started方法來通知應用程序已經啟動。最后,SpringBoot 會調用callRunners方法來運行所有的CommandLineRunnerApplicationRunner組件。

到此,相信大家對“SpringBoot啟動流程是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

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

AI

许昌市| 陈巴尔虎旗| 定州市| 明光市| 丰城市| 方正县| 合肥市| 迁安市| 吉安市| 祁连县| 郧西县| 久治县| 郴州市| 张掖市| 高碑店市| 玉林市| 西畴县| 勃利县| 定南县| 英德市| 什邡市| 康定县| 游戏| 新平| 英超| 平罗县| 马边| 邵东县| 吉林省| 林西县| 丰台区| 田东县| 芜湖市| 万山特区| 天全县| 垦利县| 延边| 铜梁县| 嘉义市| 富锦市| 登封市|