首页 > 其他分享 >SpringBoot的启动流程扩展点

SpringBoot的启动流程扩展点

时间:2023-10-11 11:58:02浏览次数:46  
标签:SpringBoot 流程 扩展 applicationArguments listeners var11 0A% context 上下文

阅读说明:
1.如果有排版格式问题,请移步https://www.yuque.com/mrhuang-ire4d/oufb8x/yo5ywqt5eudxvxfc?singleDoc#%20%E3%80%8ASpring%E5%8F%AF%E6%89%A9%E5%B1%95%E6%8E%A5%E5%8F%A3%E6%80%BB%E7%BB%93%E3%80%8B,选择宽屏模式效果更佳。
2.本文为原创文章,转发请注明出处。

SpringBoot的启动流程

启动源码如下:

    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);
            Banner printedBanner = this.printBanner(environment);
            context = this.createApplicationContext();
            context.setApplicationStartup(this.applicationStartup);
            this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
            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);
            this.callRunners(context, applicationArguments);
        } catch (Throwable var12) {
            if (var12 instanceof SpringApplication.AbandonedRunException) {
                throw var12;
            }

            this.handleRunFailure(context, var12, listeners);
            throw new IllegalStateException(var12);
        }

        try {
            if (context.isRunning()) {
                Duration timeTakenToReady = Duration.ofNanos(System.nanoTime() - startTime);
                listeners.ready(context, timeTakenToReady);
            }

            return context;
        } catch (Throwable var11) {
            if (var11 instanceof SpringApplication.AbandonedRunException) {
                throw var11;
            } else {
                this.handleRunFailure(context, var11, (SpringApplicationRunListeners)null);
                throw new IllegalStateException(var11);
            }
        }
    }

上下文准备

调用扩展点:ApplicationContextInitializer
发布上下文初始化事件:ApplicationContextInitializedEvent

上下文刷新

扫描注册beanDefinition;
创建bean流程;
发布上下文刷新事件:ContextRefreshedEvent

上下文刷新完成

发布上下文已启动事件:ApplicationStartedEvent
执行扩展点:ApplicationRunner,CommandLineRunner

最后

发布上下文ready事件:ApplicationReadyEvent

启动流程扩展点调用图:

 


 

参考:
[1].https://blog.csdn.net/weixin_38650898/article/details/124320262
[2].https://mp.weixin.qq.com/s/dIv3FoLQuZRKpJNqo5H0LQ
%0A%0A%0A%0A%E5%8F%82%E8%80%83%EF%BC%9A%0A%5B1%5D.https%3A%2F%2Fblog.csdn.net%2Fweixin_38650898%2Farticle%2Fdetails%2F124320262%0A%5B2%5D.https%3A%2F%2Fmp.weixin.qq.com%2Fs%2FdIv3FoLQuZRKpJNqo5H0LQ%0A%5B3%5D.
[3].https://www.cnblogs.com/myshare/p/17727492.html
[4].https://blog.csdn.net/ZXMSH/article/details/125587779

标签:SpringBoot,流程,扩展,applicationArguments,listeners,var11,0A%,context,上下文
From: https://www.cnblogs.com/itThinking/p/17756717.html

相关文章

  • 2023年10月10日 KdMapper扩展实现之SOKNO S.R.L(speedfan.sys)
    1.背景  KdMapper是一个利用intel的驱动漏洞可以无痕的加载未经签名的驱动,本文是利用其它漏洞(参考《【转载】利用签名驱动漏洞加载未签名驱动》)做相应的修改以实现类似功能。需要大家对KdMapper的代码有一定了解。 2.驱动信息 驱动名称speedfan.sys 时间戳50DF5......
  • SpringBootWeb登录认证 上
    案例-登录认证在前面的课程中,我们已经实现了部门管理、员工管理的基本功能,但是大家会发现,我们并没有登录,就直接访问到了Tlias智能学习辅助系统的后台。这是不安全的,所以我们今天的主题就是登录认证。最终我们要实现的效果就是用户必须登录之后,才可以访问后台系统中的功能。1.登......
  • SpringBootWeb登录认证上中
    2.2.2.2方案二-Session前面介绍的时候,我们提到Session,它是服务器端会话跟踪技术,所以它是存储在服务器端的。而Session的底层其实就是基于我们刚才所介绍的Cookie来实现的。获取Session如果我们现在要基于Session来进行会话跟踪,浏览器在第一次请求服务器的时候,我们就可......
  • SpringBootWeb登录认证下
    2.5拦截器Interceptor学习完了过滤器Filter之后,接下来我们继续学习拦截器Interseptor。拦截器我们主要分为三个方面进行讲解:介绍下什么是拦截器,并通过快速入门程序上手拦截器拦截器的使用细节通过拦截器Interceptor完成登录校验功能我们先学习第一块内容:拦截器快速入门2.5.1快速......
  • SpringBootWeb登录认证中下
    2.4过滤器Filter刚才通过浏览器的开发者工具,我们可以看到在后续的请求当中,都会在请求头中携带JWT令牌到服务端,而服务端需要统一拦截所有的请求,从而判断是否携带的有合法的JWT令牌。那怎么样来统一拦截到所有的请求校验令牌的有效性呢?这里我们会学习两种解决方案:Filter过滤器Inter......
  • SpringBoot 2.7.x 整合 swagger2 冲突问题
    问题描述SpringBoot2.7.x版本在整合swagger2时抛出异常如下:复制代码org.springframework.context.ApplicationContextException:Failedtostartbean'documentationPluginsBootstrapper';nestedexceptionisjava.lang.NullPointerException atorg.springframework......
  • springboot配置启动文件的问题
    1、缘由:用sh命令启动bat时出现错误端口号就找错了。  原bat。启动时发现端口是8081,但我的application.properties写的不是8081啊,为什么会找8081,原来是因为如果你用bat快捷方式启动,他会在bat目录下,找到propertity文件,如果用sh启动,则找不到propertity文件,这时springboot会默......
  • 前台首页、导出项目依赖、git介绍和安装、git,github,gitab,gitee介绍、git工作流程、git
    前台首页Header.vur<template><divclass="header"><divclass="slogan"><p>老男孩IT教育|帮助有志向的年轻人通过努力学习获得体面的工作和生活</p></div><divclass="nav"><ulclass="......
  • 13-io扩展技术与存储器映射扩展
    IO扩展技术与存储器映射扩展io扩展方式代码如下:#include<REGX52.H>voidDelay_ms(unsignedintxms){ unsignedinti,j; for(i=0;i<xms;i++){ for(j=0;j<299;j++); }}void_74HC138(unsignedcharn){ switch(n){ case4: P2=(P2&0x1f......
  • springboot整合mybatis中使用分页插件 getTotal为0的原因(本人出现的问题)
      本人将实现分页插件---pagehelper.startpage()放到 ---page<Employee>这条语句的前面就获得到了total的值 ......