• SpringApplication启动详解说明


    转自:

    SpringApplication启动详解说明

    下文笔者详细讲述SpringApplication启动的相关说明,如下所示:

    SpringApplication简介

    SpringApplication是springboot驱动spring应用上下文的引导类
    他的run()方法启动Spring应用
    其作用为Spring应用创建并初始化Spring上下文

    SpringApplication执行流程

    1.初始化监听器,以及添加到SpringApplication的自定义监听器
    
    2.发布ApplicationStartedEvent事件,如果想监听ApplicationStartedEvent事件,
    你可以这样定义:public class ApplicationStartedListener implements ApplicationListener,然后通过SpringApplication.addListener(..)添加进去即可
    
    3.装配参数和环境,确定是web环境还是非web环境
    
    4.装配完环境后,就触发ApplicationEnvironmentPreparedEvent事件
    
    5.如果SpringApplication的showBanner属性被设置为true,则打印启动的Banner
     
    6.创建ApplicationContext,会根据是否是web环境,来决定创建什么类型的ApplicationContext
     
    7.装配Context的环境变量,注册Initializers、beanNameGenerator等
    
    8.发布ApplicationPreparedEvent事件
    
    9.注册springApplicationArguments、springBootBanner,加载资源等
    
    10.遍历调用所有SpringApplicationRunListener的contextLoaded()方法
    
    11.调用ApplicationContext的refresh()方法,装配context beanfactory等非常重要的核心组件
    
    12.查找当前ApplicationContext中是否注册有CommandLineRunner,如果有,则遍历执行它们
    
    13.发布ApplicationReadyEvent事件,启动完毕,表示服务已经可以开始正常提供服务了。通常我们这里会监听这个事件来打印一些监控性质的日志,表示应用正常启动了
    
    SpringBoot会触发其他的一些事件,这些事件按下列顺序触发
    (1)ApplicationStartingEvent:项目刚启动时触发,此时除了注册监听器和初始器之外,其他所有处理都没有开始
    (2)ApplicationEnvironmentPreparedEvent:上下文得到环境信息之后触发,此时上下文创建还没有创建
    (3)ApplicationPreparedEvent:bean的定义信息加载完成之后触发,此时bean还没有初始化
    (4)ApplicationReadyEvent:在所有bean初始化完毕,所有回调处理完成,系统准备处理服务请求时触发
    (5)ApplicationFailedEvent:启动过程出现异常时候触发
    

    SpringApplication.run()

    当运行SpringApplication的静态run方法
      首先要创建一个SpringApplication对象实例
    然后调用这个创建好的SpringApplication的实例方法。在SpringApplication实例初始化的时候,它会提前做几件事情:
    
    1. 根据classpath里面是否存在某个特征类(org.springframework.web.context.ConfigurableWebApplicationContext)来决定是否应该创建一个为Web应用使用的ApplicationContext类型。
    
    2. 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer。
    
    3. 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationListener。
    
    4. 推断并设置main方法的定义类。
    
    它会执行以下步骤:
    
    1. 创建一个合适的ApplicationContext实例 (取决于classpath)。
    
    2. 注册一个CommandLinePropertySource,以便将命令行参数作为Spring properties。
    
    3. 刷新application context,加载所有单例beans。
    
    4. 激活所有CommandLineRunner beans。
    
    Run启动方式
    @SpringBootApplication 
    public class Application {
        //方式一
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
        //方式二
        public static void main(String[] args) {
            SpringApplication app = new SpringApplication(MySpringConfiguration.class);
            app.run(args);
        }
    	//方式三
        public static void main(String[] args) {
            new SpringApplicationBuilder()
                .sources(Parent.class)
                .child(Application.class)
                .run(args);
        }
    }
    1. SpringApplication.run()的底层其实就是new了一个SpringApplication的对象,并执行run()方法。
    
    2. 有时我们需要创建多层次的ApplicationContext (如,父子关系的Spring的ApplicationContext 和SpringMVC
     此时可使用SpringApplicationBuilder讲多个方法调用串起来,通过parent() 和 child()来创建多层次的ApplicationContext。 
  • 相关阅读:
    Python程序笔记2023004
    倒计时第3天!Google Summer of Code报名即将截止!(Casbin社区还有空缺名额)
    ES京东搜索
    ElasticSearch这些坑记得避开
    ABAP 调用HTTP上传附件(二)之中文乱码
    工厂模式之工厂方法模式(常用)
    想完全掌握Swagger,这一篇就够了!
    网络初识
    BGP联邦实验
    解析如何在vue3中使用Element-UI组件以及main.js文件
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/127877830