最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot 之啟動流程詳解

 更新時間:2023年04月24日 09:08:04   作者:這堆干貨有點(diǎn)猛  
SpringBoot 是一個基于 Spring 框架的快速開發(fā)框架,旨在簡化 Spring 應(yīng)用程序的開發(fā)和部署。在本文中,我們將深入分析 SpringBoot 啟動過程的源代碼,并提供必要的解釋和說明

SpringBoot啟動過程簡介

SpringBoot應(yīng)用程序的啟動過程可以分為以下幾個步驟:

  • 加載應(yīng)用程序上下文
  • 掃描應(yīng)用程序中的所有組件
  • 自動配置應(yīng)用程序環(huán)境
  • 啟動嵌入式Web服務(wù)器

在下面的章節(jié)中,我們將逐一分析這些步驟的源代碼。

加載應(yīng)用程序上下文

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

這個步驟的源代碼在SpringApplication類中。具體來說,SpringApplication類的run方法是這個過程的入口點(diǎn)。在這個方法中,Spring Boot會通過調(diào)用createApplicationContext方法來創(chuàng)建應(yīng)用程序上下文。

下面是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 會根據(jù)應(yīng)用程序類型(Servlet或Reactive)選擇合適的上下文類。然后,它會使用 Java 反射機(jī)制來實例化這個類并返回一個可配置的應(yīng)用程序上下文對象。

掃描應(yīng)用程序中的所有組件

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

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

下面是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 會創(chuàng)建一個ClassPathScanningCandidateComponentProvider對象,并使用它來掃描應(yīng)用程序中的所有組件。這個對象會掃描指定包路徑下的所有類,并將它們轉(zhuǎn)換為 Spring 的 Bean 定義。這些 Bean 定義將被注冊到應(yīng)用程序上下文中。

自動配置應(yīng)用程序環(huán)境

在上一步中,SpringBoot將應(yīng)用程序中的所有組件注冊到應(yīng)用程序上下文中。在這一步中,SpringBoot將自動配置應(yīng)用程序環(huán)境,包括配置數(shù)據(jù)源、事務(wù)管理器、JPA等。

這個步驟的源代碼在SpringApplication類中的configureEnvironment方法中。在這個方法中,Spring Boot會創(chuàng)建一個SpringApplicationRunListeners對象,并使用它來配置應(yīng)用程序環(huán)境。

下面是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 會創(chuàng)建一個ApplicationArguments對象,并將其轉(zhuǎn)換為一個命令行屬性源。然后,它會調(diào)用listeners中的environmentPrepared方法來通知應(yīng)用程序環(huán)境已經(jīng)準(zhǔn)備好了。隨后,SpringBoot 會綁定屬性源到應(yīng)用程序環(huán)境中,并調(diào)用listeners中的environmentPrepared方法來通知應(yīng)用程序環(huán)境已經(jīng)準(zhǔn)備好了。

啟動嵌入式Web服務(wù)器

在上一步中,SpringBoot 將應(yīng)用程序環(huán)境自動配置完成。在這一步中,SpringBoot 將啟動嵌入式Web服務(wù)器,以便應(yīng)用程序能夠提供 Web 服務(wù)。

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

下面是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對象來計算應(yīng)用程序啟動時間。然后,它會調(diào)用listeners中的starting方法來通知應(yīng)用程序即將啟動。接著,SpringBoot 會準(zhǔn)備應(yīng)用程序環(huán)境,并使用它來創(chuàng)建應(yīng)用程序上下文。隨后,SpringBoot 會調(diào)用listeners中的started方法來通知應(yīng)用程序已經(jīng)啟動。最后,SpringBoot 會調(diào)用callRunners方法來運(yùn)行所有的CommandLineRunnerApplicationRunner組件。

總結(jié)

在本文中,我們深入分析了 SpringBoot 應(yīng)用程序的啟動過程的源代碼。我們了解了 SpringBoot 如何加載應(yīng)用程序上下文、掃描應(yīng)用程序中的所有組件、自動配置應(yīng)用程序環(huán)境以及啟動嵌入式Web服務(wù)器。這些步驟的源代碼展示了 SpringBoot 如何簡化應(yīng)用程序的開發(fā)和部署。

以上就是SpringBoot 之啟動流程詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot啟動流程的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Javaweb接收表單數(shù)據(jù)并處理中文亂碼

    Javaweb接收表單數(shù)據(jù)并處理中文亂碼

    這篇文章主要介紹了Javaweb接收表單數(shù)據(jù)并處理中文亂碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • Java面試必備之ArrayList陷阱解析

    Java面試必備之ArrayList陷阱解析

    昨天小楓接到了一個公司的面試電話,其中一道面試題覺得有點(diǎn)意思,在這里和大家一起分享下。面試題是ArrayList如何刪除指定元素。乍聽很簡單的問題,但是如果沒有實際踩過坑很容易掉進(jìn)面試官的陷阱中,我們一起來分析下吧
    2022-02-02
  • SpringBoot上下文初始器加載過程詳解

    SpringBoot上下文初始器加載過程詳解

    這篇文章主要介紹了SpringBoot上下文初始器加載過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • Spring實現(xiàn)Aware接口自定義獲取bean的兩種方式

    Spring實現(xiàn)Aware接口自定義獲取bean的兩種方式

    這篇文章主要介紹了Java編程實現(xiàn)Aware接口自定義獲取bean的兩種方式,通過BeanFactoryAware和ApplicationContextAware,具有一定參考價值,需要的朋友可以了解下。
    2017-09-09
  • Java中比較抽象類與接口的異同

    Java中比較抽象類與接口的異同

    大家好,本篇文章主要講的是Java中比較抽象類與接口的異同,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • java利用easyexcel實現(xiàn)導(dǎo)入與導(dǎo)出功能

    java利用easyexcel實現(xiàn)導(dǎo)入與導(dǎo)出功能

    這篇文章主要介紹了java利用easyexcel實現(xiàn)導(dǎo)入與導(dǎo)出功能,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助
    2022-09-09
  • springboot如何使用@ConfigurationProperties封裝配置文件

    springboot如何使用@ConfigurationProperties封裝配置文件

    springboot如何使用@ConfigurationProperties封裝配置文件的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java框架Struts2實現(xiàn)圖片上傳功能

    Java框架Struts2實現(xiàn)圖片上傳功能

    這篇文章主要為大家詳細(xì)介紹了Java框架Struts2實現(xiàn)圖片上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • SpringBoot對數(shù)據(jù)訪問層進(jìn)行單元測試的方法詳解

    SpringBoot對數(shù)據(jù)訪問層進(jìn)行單元測試的方法詳解

    我們公司作為一個面向銀行、金融機(jī)構(gòu)的TO B類企業(yè),頻繁遇到各個甲方爸爸提出的國產(chǎn)化數(shù)據(jù)庫的改造需求,包括OceanBase, TiDB,geldenDB等等,本文就介紹一種快高效、可復(fù)用的解決方案——對數(shù)據(jù)訪問層做單元測試,需要的朋友可以參考下
    2023-08-08
  • Java對時間的簡單操作實例

    Java對時間的簡單操作實例

    這篇文章主要介紹了Java對時間的簡單操作,實例分析了針對java.util.Date的各類常見操作,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01

最新評論

蛟河市| 原平市| 南丰县| 长沙市| 高陵县| 和硕县| 东阿县| 民勤县| 盘山县| 老河口市| 苏尼特右旗| 黄龙县| 吴江市| 江山市| 花垣县| 德州市| 隆德县| 瑞金市| 靖西县| 陕西省| 江阴市| 修文县| 正定县| 陆河县| 电白县| 新昌县| 长岛县| 泾源县| 招远市| 丽水市| 马鞍山市| 华容县| 泰安市| 汉阴县| 崇信县| 从江县| 唐山市| 宁波市| 天气| 威远县| 金山区|