Spring源码深度解析:run函数启动流程全揭秘

Spring框架作为Java应用开发的基石,其启动流程是每个开发者都应该深入了解的部分。本文将详细剖析Spring源码中的run函数启动流程,带你一步步走进Spring的启动世界。

一、SpringApplication对象的创建

当我们调用SpringApplication.run(Class<?> primarySource, String… args)方法时,首先会创建一个SpringApplication对象。在这个过程中,Spring会进行一些初始化的工作,包括:

推断应用类型:根据传入的primarySource(主类)和类路径,推断应用是Web应用还是非Web应用。

设置应用上下文类:根据应用类型,选择合适的ApplicationContext实现类。例如,对于Web应用,通常会选择AnnotationConfigServletWebServerApplicationContext。

注册命令行参数:将传入的args(命令行参数)保存到SpringApplication对象中,供后续使用。

二、加载和准备环境

在SpringApplication对象创建完成后,run方法会继续加载和准备环境。

创建环境:根据是否使用了Web环境,创建相应的ConfigurableEnvironment实例(如StandardEnvironment或StandardServletEnvironment)。

配置环境属性:从配置文件(如application.properties或application.yml)和命令行参数中加载属性,并设置到环境中。

创建监听器:根据配置创建并注册一系列ApplicationListener,这些监听器会在应用启动的不同阶段触发相应的事件。

三、创建应用上下文

环境准备好之后,run方法开始创建应用上下文。

创建上下文:根据之前确定的ApplicationContext类,创建相应的上下文实例。

准备上下文:对上下文进行一系列的初始化操作,如设置环境、注册BeanPostProcessor等。

四、加载Bean定义

接下来,Spring会加载Bean定义到上下文中。

扫描组件:通过@ComponentScan注解或其他方式扫描指定的包路径,找出需要管理的Bean。

解析配置类:解析使用@Configuration注解的配置类,提取其中的Bean定义。

注册Bean定义:将扫描和解析得到的Bean定义注册到上下文的BeanDefinitionRegistry中。

五、刷新上下文

Bean定义加载完成后,run方法会调用refresh方法刷新上下文。

准备刷新:处理一些前置的刷新任务,如激活BeanFactory的PostProcessor等。

获取Bean工厂:初始化DefaultListableBeanFactory,这是Spring IoC容器的核心部分。

准备Bean工厂:配置BeanFactory的相关属性,如类加载器、Bean后处理器等。

后处理BeanFactory:触发PostProcessorRegistrationDelegate进行Bean后处理器的注册和调用。

注册BeanPostProcessor:将用户自定义的BeanPostProcessor注册到BeanFactory中。

初始化消息源:初始化应用上下文的消息源。

初始化事件多播器:创建并初始化事件多播器,用于事件发布。

完成BeanFactory的初始化:完成BeanFactory的初始化工作,包括解析占位符、加载单例Bean等。

注册监听器:将之前创建的ApplicationListener注册到事件多播器中。

启动应用:发布应用启动完成事件,通知所有注册的监听器应用已经启动。

六、执行主类方法

在刷新上下文完成后,run方法还会尝试调用主类(即传入的primarySource)中的main方法(如果存在的话)。这通常用于执行一些额外的初始化任务或业务逻辑。

七、返回应用上下文

最后,run方法会返回创建并初始化完成的应用上下文对象,供开发者后续使用。

八、总结

通过以上详细的步骤解析,我们可以看到Spring的启动流程是一个复杂而有序的过程。从创建SpringApplication对象开始,到加载和准备环境、创建应用上下文、加载Bean定义、刷新上下文,最终返回应用上下文,每一步都承载着Spring框架的核心思想和机制。

理解这个启动流程不仅可以帮助我们更好地使用Spring框架进行应用开发,还可以为我们深入探究Spring的内部机制、优化应用性能、解决启动问题等提供有力的支持。希望本文能对你有所帮助,让你对Spring的启动流程有更深入的认识。

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值