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

SpringBoot 之啟動流程詳解

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

SpringBoot啟動過程簡介

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

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

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

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

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

這個(gè)步驟的源代碼在SpringApplication類中。具體來說,SpringApplication類的run方法是這個(gè)過程的入口點(diǎn)。在這個(gè)方法中,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);
}

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

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

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

這個(gè)步驟的源代碼在SpringApplication類中的scan方法中。具體來說,在這個(gè)方法中,SpringBoot 會創(chuàng)建一個(gè)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);
    }
}

在這個(gè)方法中,SpringBoot 會創(chuàng)建一個(gè)ClassPathScanningCandidateComponentProvider對象,并使用它來掃描應(yīng)用程序中的所有組件。這個(gè)對象會掃描指定包路徑下的所有類,并將它們轉(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等。

這個(gè)步驟的源代碼在SpringApplication類中的configureEnvironment方法中。在這個(gè)方法中,Spring Boot會創(chuàng)建一個(gè)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);
}

在這個(gè)方法中,SpringBoot 會創(chuàng)建一個(gè)ApplicationArguments對象,并將其轉(zhuǎn)換為一個(gè)命令行屬性源。然后,它會調(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ù)。

這個(gè)步驟的源代碼在SpringApplication類中的run方法中。具體來說,在這個(gè)方法中,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;
}

在這個(gè)方法中,SpringBoot 會使用一個(gè)StopWatch對象來計(jì)算應(yīng)用程序啟動時(shí)間。然后,它會調(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í)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java面試必備之ArrayList陷阱解析

    Java面試必備之ArrayList陷阱解析

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Java對時(shí)間的簡單操作實(shí)例

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

最新評論

贺州市| 驻马店市| 西峡县| 科技| 惠来县| 肃南| 建瓯市| 武清区| 青田县| 安康市| 筠连县| 东乌珠穆沁旗| 大洼县| 合川市| 甘孜| 娄烦县| 汤阴县| 乐都县| 习水县| 隆昌县| 博乐市| 噶尔县| 达孜县| 腾冲县| 高安市| 枣强县| 平遥县| 绍兴市| 光山县| 闽侯县| 清徐县| 鸡泽县| 唐海县| 夏邑县| 柯坪县| 孝感市| 微博| 桂东县| 铜鼓县| 巴楚县| 长海县|