文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot 的启动流程

2023-09-28 14:38

关注

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()

      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);        }    }

来源地址:https://blog.csdn.net/m0_52058662/article/details/128973271

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯