Spring Boot 启动流程

  • Post author:
  • Post category:其他




Spring Boot 启动流程




简介



步骤



加载配置

Spring Boot在启动时会加载应用程序的配置文件(例如application.properties或application.yml),并将其转化为内部的配置对象。



创建应用程序上下文

Spring Boot会创建一个应用程序上下文(ApplicationContext),它是Spring框架的核心容器。应用程序上下文负责管理Bean的生命周期和依赖注入等任务。



执行自动配置

Spring Boot通过自动配置机制根据应用程序的依赖和配置,自动配置Spring框架的各个模块。自动配置基于约定优于配置的原则,可以根据类路径上的依赖和配置来自动配置数据库、Web服务器、消息队列等。



启动应用程序

Spring Boot启动时会执行主类中的main方法,通过调用SpringApplication的静态run方法来启动应用程序。在此过程中,Spring Boot会创建一个嵌入式的Web服务器(如Tomcat),并将应用程序的请求交给该服务器处理。



处理请求

一旦应用程序启动并监听指定的端口,它将能够处理来自客户端的HTTP请求。Spring Boot使用Spring MVC框架来处理请求,并根据请求的URL映射到相应的Controller处理业务逻辑。



源码层说明

  • 1.SpringApplication.run 方法启动应用;
  • 2.SpringApplication 类的 run 方法中,首先创建一个 SpringApplication 对象,并将传入的参数进行处理,包括将参数转换为 SpringApplication 对象的属性、设置应用的环境等;
  • 3.接着,SpringApplication 类会调用 createApplicationContext 方法创建一个 Spring 应用上下文(Application Context),并将其保存在 applicationContext 字段中。

    在创建应用上下文的过程中,会根据不同的条件选择不同的应用上下文,如是否启用 Web 环境、是否使用嵌入式的 Servlet 容器等;
  • 4.应用上下文创建成功后,SpringApplication 类会调用 prepareContext 方法对应用上下文进行一些预处理操作,例如设置默认的属性、注册默认的 Bean、应用一些配置等;
  • 5.然后,SpringApplication 类会调用 applyInitializers 方法执行一些初始化操作,例如调用 ApplicationContextInitializer 接口实现类中的 initialize 方法;
  • 6.紧接着,SpringApplication 类会调用 listeners 字段中保存的所有 ApplicationListener 接口实现类中的 onApplicationEvent 方法,完成事件监听器的执行;
  • 7.最后,SpringApplication 类会调用 refreshContext 方法,启动应用上下文,并开始接收请求。

    在整个启动过程中,核心知识点包括:


    • 应用上下文的创建和选择

    • 预处理操作和初始化操作的执行

    • 事件监听器的注册和执行

    • 应用上下文的启动



扩展



自定义注解以及自定义注解实现中有bean,与启动流程什么有关

  • 自定义注解的启用涉及到两个关键步骤:

    Bean扫描和注解处理。


Bean扫描

在Spring Boot的启动过程中,会执行Bean扫描操作,通过扫描指定的包路径,查找并注册所有被注解标记的类(包括自定义注解中的类)作为Bean。这个步骤一般发生在应用上下文创建之前,通常在 prepareContext 方法中完成。可以通过 @ComponentScan 注解来指定要扫描的包路径,确保自定义注解所在的包被扫描到。



注解处理

在Bean扫描后,Spring会处理所有注册的Bean,包括对注解的解析和处理。当自定义注解标记在某个类上时,Spring会解析该注解并执行相应的逻辑。如果自定义注解中涉及到使用Service(或其他Bean),通常是通过依赖注入的方式进行加载。在自定义注解所标记的类中,可以使用 @Autowired 或者 @Resource 注解来注入所需的Service或其他Bean,Spring会负责将相应的Bean注入到对应的字段或方法参数中。


需要注意的是,自定义注解所在的类必须被扫描到并注册为Bean,才能触发注解处理和相关的依赖注入操作。确保自定义注解所在的包路径被正确扫描,同时注解所标记的类也需要被正确加载和实例化



版权声明:本文为Cy_LightBule原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。