SpringBoot 的启动流程

这篇具有很好参考价值的文章主要介绍了SpringBoot 的启动流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SpringBoot 的启动流程

一、 生成SpringApplication对象
1. webApplicationType = 推测web应用的类型(NODE(普通项目)、SERVLET(Servlet web项目)、 * REACTIVE(响应式项目 flux)
2. 从spring.factories 中获取BootstrapRegistryInitializer对象
3. initializers = 从spring.factories中获取ApplicationContextInitializer对象
4. isteners = 从spring.factories中获取ApplicationListener对象
二、 该方法启动SpringBoot项目
1. 调用run方法–> (new SpringApplication(primarySources)).run(args);
2. 先生成SpringApplication对象,之后调用run方法 primarySource --> 传进去的的类相当于配置类,可以为一个数组。
3. SpringApplicationListener.starting()
4. 创建一个Spring容器
5. ApplicationContextInitializer—>初始化Spring容器
6.SpringApplicationRunListener.contextPrepared()
7. 把传给run方法的的配置类注册成bean
8. SpringApplicationRunListener.contextLoaded()会
9. 解析配置类、扫描、启动Tomcat/Jetty/Undertow
(AutoConfigurationImportSelector、DeferredImportSelector)
10. SpringApplicationRunListener.started()
11. callRunners–>ApplicationRunner、CommandLineRunner
12. SpringApplicationListener.ready()文章来源地址https://www.toymoban.com/news/detail-647922.html

    /**
     * 生成SpringApplication对象
     *      webApplicationType = 推测web应用的类型(NODE(普通项目)、SERVLET(Servlet web项目)、      * REACTIVE(响应式项目 flux)
     *      从spring.factories 中获取BootstrapRegistryInitializer对象
     *      initializers = 从spring.factories中获取ApplicationContextInitializer对象
     *      listeners = 从spring.factories中获取ApplicationListener对象
     *
     * 该方法启动SpringBoot项目
     *      调用run方法--> (new SpringApplication(primarySources)).run(args);
     *      先生成SpringApplication对象,之后调用run方法   primarySource --> 传进去的的类相当于配             置类,可以为一个数组。
     *      SpringApplicationListener.starting()
     *      创建一个Spring容器
     *      ApplicationContextInitializer--->初始化Spring容器
     *      SpringApplicationRunListener.contextPrepared()
     *      把传给run方法的的配置类注册成bean
     *      SpringApplicationRunListener.contextLoaded()
     *      会解析配置类、扫描、启动               				Tomcat/Jetty/Undertow(AutoConfigurationImportSelector、DeferredImportSelector)
     *      SpringApplicationRunListener.started()
     *      callRunners-->ApplicationRunner、CommandLineRunner
     *      SpringApplicationListener.ready()
     *
     */
  public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
        this.sources = new LinkedHashSet();
        this.bannerMode = Mode.CONSOLE;
        this.logStartupInfo = true;
        this.addCommandLineProperties = true;
        this.addConversionService = true;
        this.headless = true;
        this.registerShutdownHook = true;
        this.additionalProfiles = Collections.emptySet();
        this.isCustomEnvironment = false;
        this.lazyInitialization = false;
        //设置applicationContextFactory类型
        this.applicationContextFactory = ApplicationContextFactory.DEFAULT;
        //默认的“无操作”应用程序启动实现
        this.applicationStartup = ApplicationStartup.DEFAULT;
        this.resourceLoader = resourceLoader;//资源
        Assert.notNull(primarySources, "PrimarySources must not be null");
        //传入的配置类
        this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));
        //判断SpringBoot项目类型 webApplicationType=NODE、Servlet、Reactive
        this.webApplicationType = WebApplicationType.deduceFromClasspath();
        //启动应用初始化器
        this.bootstrapRegistryInitializers = new ArrayList(this.getSpringFactoriesInstances(BootstrapRegistryInitializer.class));
        //初始化容器
 this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
        //设置监听器
        this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
        //检查主应用程序
        this.mainApplicationClass = this.deduceMainApplicationClass();
 }

public ConfigurableApplicationContext run(String... args) {
        long startTime = System.nanoTime();//记录开始时间
        DefaultBootstrapContext bootstrapContext = this.createBootstrapContext();
        ConfigurableApplicationContext context = null;
        this.configureHeadlessProperty();
        SpringApplicationRunListeners listeners = this.getRunListeners(args);//获得监听器
        listeners.starting(bootstrapContext, this.mainApplicationClass);//执行监听器
        try {
            ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);//初始化默认应用参数类、命令行参数
            ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments);//获得系统环境以及配置信息
            this.configureIgnoreBeanInfo(environment);//排除某些bean
            Banner printedBanner = this.printBanner(environment);//获得打印banner的信息
            context = this.createApplicationContext();//创建ApplicationContext即Spring容器
            context.setApplicationStartup(this.applicationStartup);
            this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);//SpringApplicationRunListener.contextPrepared()
            this.refreshContext(context);//刷新应用上下文
            this.afterRefresh(context, applicationArguments);
            Duration timeTakenToStartup = Duration.ofNanos(System.nanoTime() - startTime);//了的获得执行时间
            if (this.logStartupInfo) {
                (new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), timeTakenToStartup);
            }
            listeners.started(context, timeTakenToStartup);//执行监听器
            //callRunners-->ApplicationRunner、CommandLineRunner
            this.callRunners(context, applicationArguments);
        } catch (Throwable var12) {
            //处理异常
            this.handleRunFailure(context, var12, listeners);
            throw new IllegalStateException(var12);
        }
        try {
            Duration timeTakenToReady = Duration.ofNanos(System.nanoTime() - startTime);
            //执行ready
            listeners.ready(context, timeTakenToReady);
            return context;
        } catch (Throwable var11) {
            this.handleRunFailure(context, var11, (SpringApplicationRunListeners)null);
            throw new IllegalStateException(var11);
        }
    }

到了这里,关于SpringBoot 的启动流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JAVA面试】SpringBoot如何启动的Tomcat

    提示:文章先作为初版,等后续时间充足后,补充更深的内容 在Spring Boot应用程序中, 内嵌的Tomcat服务器是通过Spring Boot Starter Web模块提供的功能 来启动的。下面是Spring Boot启动Tomcat的大致过程: 引入Spring Boot Starter Web依赖:在项目的pom.xml文件中添加 Spring Boot Starter Web依赖

    2024年02月04日
    浏览(25)
  • 【Spring Boot】以博客管理系统举例,完整表述SpringBoot从对接Vue到数据库的流程与结构。

    博客管理系统是一个典型的前后端分离的应用,其中前端使用Vue框架进行开发,后端使用Spring Boot框架进行开发,数据库使用MySQL进行存储。下面是从对接Vue到数据库的完整流程和结构。 对接Vue 在前端Vue应用中,需要访问后端Spring Boot应用的REST API接口,与其进行数据交互。具

    2024年02月11日
    浏览(23)
  • SpringBoot启动报错:java: 无法访问org.springframework.boot.SpringApplication

    报错原因:jdk 1.8版本与SpringBoot 3.1.2版本不匹配 解决方案:将SpringBoot版本降到2系列版本(例如2.5.4)。如下图: 修改版本后切记刷新Meavn依赖 然后重新启动即可成功。如下图:

    2024年02月13日
    浏览(29)
  • Spring Boot 启动流程

    加载配置 Spring Boot在启动时会加载应用程序的配置文件(例如application.properties或application.yml),并将其转化为内部的配置对象。 创建应用程序上下文 Spring Boot会创建一个应用程序上下文(ApplicationContext),它是Spring框架的核心容器。应用程序上下文负责管理Bean的生命周期和

    2024年02月06日
    浏览(23)
  • Spring Boot的启动流程

    Spring Boot是作为Spring的脚手架框架,其本身并不提供Spring的核心功能,而是来达到快速构建项目、预置三方配置、开箱即用的目的 。 从本质上来说,Spring Boot就是Spring,它做了那些没有它你自己也会去做的Spring Bean配置。 Spring Boot使用“习惯优于配置”的理念让你的项目快速

    2024年02月02日
    浏览(21)
  • Spring Boot启动流程简析

    文章首发地址 可以穿件独立的Spring应用程序,可以创建可执行的jars 内嵌tomcat或jetty等Servlet容器 提供“入门”依赖项,以简化构建配置。尽可能自动配置Spring和第三方库 提供可用于生产的功能,例如指标、运行状况检查和外部化配置 了解基本的启动注解 AnnotationUtil.java,该

    2024年02月16日
    浏览(31)
  • Java开发之框架(spring、springmvc、springboot、mybatis)【面试篇 完结版】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 本文主要记录spring的单例bean、切面编程AOP、spring事务、循环依赖、常见注解等 提示:以下是本篇文章正文内容,下面案例可供参考 ① 问题引入 Spring框架中的bean是单例的 singleton :bean在每个Spring IOC容

    2024年02月07日
    浏览(29)
  • 三分钟了解Spring Boot 的启动流程

    👏作者简介:大家好,我是冰点,从业11年,目前在物流独角兽企业从事技术方面工作, 🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人 📝联系方式:iceicepip,加我进群,大家一起学习,一起进步👀 背景:最近有位开发同学说面试被问到Spring Boot 的启动

    2024年02月08日
    浏览(23)
  • 全网最清楚的:Spring Boot 启动流程讲解

    Spring Boot 启动流程 简介 步骤 加载配置 创建应用程序上下文 执行自动配置 启动应用程序 处理请求 源码层说明 扩展 自定义注解以及自定义注解实现中有bean,与启动流程什么有关 Bean扫描 注解处理 Spring Boot 的启动流程 充分利用了 Spring 框架的强大功能,同时又为开发者提供

    2024年02月07日
    浏览(26)
  • Spring Boot 3.x 系列【51】启动流程 | 最后阶段

    有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.1.0 源码地址:https://gitee.com/pearl-organization/study-spring-boot3 终于启动流程到了最后一个阶段,这里主要是打印启动完成日志、调用监听器、运行 Runners 等 。

    2024年02月15日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包