SpringBoot 必懂SpringApplication

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

在这里插入图片描述

  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方法的定义类。
    它会执行以下步骤:
  5. 创建一个合适的ApplicationContext实例 (取决于classpath)。
  6. 注册一个CommandLinePropertySource,以便将命令行参数作为Spring properties。
  7. 刷新application context,加载所有单例beans。
  8. 激活所有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。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值