问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

探秘 Spring Application 启动流程:从初始化到运行的全景解析

创作时间:
作者:
@小白创作中心

探秘 Spring Application 启动流程:从初始化到运行的全景解析

引用
CSDN
1.
https://blog.csdn.net/cooldream2009/article/details/143931758

Spring Framework是Java开发领域最受欢迎的框架之一,其强大的生态系统和灵活的架构深受开发者青睐。在日常开发中,SpringApplication类的启动逻辑是接触Spring应用的起点。无论是构建Web应用还是微服务,理解SpringApplication的运行机制对于深入掌握Spring框架的工作原理大有裨益。本文将以SpringApplication的启动与运行为核心,从初始化到启动的整个流程进行详细解读,力求帮助读者清晰掌握其中的关键步骤和设计思想。

SpringApplication的初始化过程

Spring应用启动的第一步是创建一个SpringApplication实例,这一过程包括四个核心步骤:确认应用类型、加载初始化器、加载监听器,以及记录主启动类。以下是对这些步骤的详细分析。

1.1 确认Web应用的类型

在初始化时,SpringApplication首先需要判断应用的类型。应用主要分为三类:非Web应用Servlet Web应用Reactive Web应用

Spring通过检查类路径中是否存在某些特定类(如DispatcherServlet或ReactiveWebServerApplicationContext)来推断应用类型。这一判断的结果直接影响后续使用的上下文类型(ApplicationContext),例如非Web应用会选择GenericApplicationContext,而Servlet Web应用则会使用AnnotationConfigServletWebServerApplicationContext。

这种设计实现了根据环境动态适配上下文的灵活性,为Spring的广泛适用性奠定了基础。

1.2 加载ApplicationContextInitializer

ApplicationContextInitializer是Spring提供的一种扩展机制,用于在上下文刷新之前执行自定义逻辑。

SpringApplication会扫描配置中定义的ApplicationContextInitializer并将其加载到初始化过程中。

开发者可以通过META-INF/spring.factories文件或程序化的方式添加自定义初始化器。例如,可以在初始化阶段对上下文中的属性进行动态调整,从而实现高度的定制化需求。

1.3 加载ApplicationListener

ApplicationListener是Spring的事件机制核心组件,用于监听并处理Spring生命周期中的各种事件。

SpringApplication会在初始化时加载所有的ApplicationListener,包括框架内置的和开发者自定义的监听器。

这些监听器在后续的事件发布过程中会被调用,例如应用环境准备完成、上下文刷新完成等阶段。通过监听这些事件,开发者可以插入自定义逻辑,如日志记录或资源预热。

1.4 记录主启动类

主启动类是指包含main方法的类,通常是应用的入口点。在SpringApplication初始化时,会通过堆栈分析自动捕获并记录主启动类,以便后续加载主类对应的BeanDefinition。

这种自动捕获机制不仅减少了开发者的配置工作量,还能确保主类信息的正确性。

run()方法的执行流程

完成初始化后,SpringApplication会调用run()方法启动应用。这个过程分为六个阶段,从环境准备到容器刷新,每一步都蕴含了Spring的设计智慧。

2.1 准备环境对象Environment

Environment是Spring用于管理配置属性的核心组件。run()方法首先会创建并配置Environment对象,从系统属性、环境变量和外部配置文件中加载配置信息。

通过Environment,Spring能够为应用提供强大的配置管理能力,例如支持多环境切换、属性占位符解析,以及运行时的动态调整。

2.2 打印Banner

为了增强用户体验,Spring支持在应用启动时打印Banner(横幅)。默认情况下,Spring会在控制台输出一段ASCII艺术字样的Spring标志,这一功能由SpringApplicationBannerPrinter实现。

开发者可以通过配置文件自定义Banner,或完全禁用这一功能。这种小细节体现了Spring追求细节打磨的产品思维。

2.3 实例化上下文ApplicationContext

在启动过程中,SpringApplication会根据应用类型实例化一个合适的ApplicationContext,如Servlet应用的AnnotationConfigServletWebServerApplicationContext。

这一上下文对象是Spring IoC容器的核心,负责管理应用中的所有Bean。实例化上下文时,Spring还会注册基础设施Bean,为后续的容器功能提供支持。

2.4 准备上下文

上下文实例化后,SpringApplication会对其进行一系列配置,包括:

  • 设置Environment:将前面准备好的Environment注入上下文中。
  • 注册BeanFactoryPostProcessor:用于在Bean定义加载后、实例化前对其进行修改。
  • 加载主类的BeanDefinition:主类通常用作配置类,其对应的BeanDefinition会在此阶段加载到容器中。

这一阶段确保了上下文在刷新前的完整性和一致性。

2.5 刷新容器

容器刷新是Spring应用启动的核心步骤。在这一阶段,Spring会:

  • 初始化BeanFactory
  • 调用所有注册的BeanPostProcessor
  • 完成Bean的实例化、依赖注入和生命周期回调

刷新容器后,所有的单例Bean都已就绪,可以直接用于后续的业务逻辑。

2.6 返回容器实例

容器刷新完成后,run()方法的最后一步是返回ApplicationContext对象。开发者可以通过该对象获取应用上下文中的各种资源,例如访问已注册的Bean,或触发其他操作。

总结与思考

Spring的启动过程以清晰的分层设计展现了其架构的优雅与灵活。从初始化到运行,每个阶段都提供了丰富的扩展点,开发者可以根据需要实现高度的定制化。

这种模块化的设计不仅提升了框架的适应性,也为开发者提供了探索和优化的空间。在实际开发中,理解这些细节可以帮助我们快速定位问题、优化应用性能,甚至扩展框架功能。

未来,随着Spring Boot和Spring Framework的持续演进,启动过程可能会变得更加简洁高效。然而,深入掌握当前的启动机制,依然是每一位Spring开发者的必修课。

附面试题面试题及答案

Spring Boot启动的核心流程是什么?

答案:

Spring Boot启动,其本质就是加载各种配置信息,然后初始化IOC容器并返回。

在启动的过程中会完成以下几个主要步骤:

1. 执行SpringApplication.run()

在启动类中调用SpringApplication.run时,内部会完成两件事情:

  1. 创建SpringApplication对象;
  2. 执行run方法。

2. 创建SpringApplication对象

在创建SpringApplication对象时,其构造方法主要完成以下三项工作:

  1. 确认Web应用类型
  • 一般情况下是Servlet类型。
  • 这种类型的应用将来会自动启动一个内嵌的Tomcat服务器。
  1. 加载默认配置
  • 从spring.factories配置文件中加载默认的ApplicationContextInitializer和ApplicationListener。
  1. 记录主启动类
  • 记录当前应用的主启动类,为后续的包扫描使用。

3. 调用run方法

创建好SpringApplication对象后,调用其run方法。在该方法内部主要完成以下四件事情:

  1. 准备Environment对象
  • 封装当前应用运行环境的参数,例如系统属性、环境变量等。
  1. 实例化容器
  • 仅创建ApplicationContext对象,并选择具体的上下文类型。
  1. 配置容器
  • 为容器设置Environment对象。
  • 注册BeanFactoryPostProcessor后置处理器。
  • 加载主类对应的BeanDefinition。
  1. 刷新容器
  • 执行refresh()方法,在该阶段真正创建Bean实例。

总结来说,Spring Boot启动的核心流程可以归纳为两步:

  1. 创建SpringApplication对象:确认应用类型、加载配置、记录主类。
  2. 调用run方法:实例化容器、加载Bean定义、创建Bean实例并返回。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号