Spring Boot的工作原理

文章目录


前言

在上一篇《初识SpringBoot并构建第一个SpringBoot项目》的学习后,我们对Spring Boot有了基本了解。现在,我们将通过学习Spring Boot的工作原理来进一步深入。


一、Spring Boot的核心原理

Spring Boot 的核心原理是基于 Spring 框架的,它通过自动配置(AutoConfiguration)和约定优于配置(Convention Over Configuration)的方式快速构建和部署 Spring 应用。

  1. 自动配置:Spring Boot 根据应用类路径下的依赖关系,自动装配(AutoConfiguration)相应的组件和配置。它通过在类路径中扫描配置文件和注解,将各个组件进行自动装配,减少了手动配置的工作量。

  2. 约定优于配置:Spring Boot 提供了一套默认的配置规则和约定,大部分情况下可以通过按照约定进行配置,而不需要显式地指定各种细节。它采用了一种约定的方式,将应用的配置和代码分离,使得配置更加简洁和易于维护。

二、Spring Boot的工作原理

首先,我们先看下Spring Boot的主类代码。

java 复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyProjectApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyProjectApplication.class, args);
    }
}

从这个代码里,我们可以看到,在main()方法里,仅调用了SpringApplication.run()方法。总体上来说,可以分为两部分:一是创建SpringApplication对象,二是调用实例的run方法。

1.创建SpringApplication对象

创建SpringApplication对象时,主要干了下面4个事情。

  1. 推断应用的类型是普通的项目还是Web项目。主要是通过classpath内是否存在某个特征类来进行判断。判断后用webEnvironment进行标记。

  2. 查找并加载所有可用初始化器 , 设置到initializers属性中。主要使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer。

  3. 找出所有的应用程序监听器,设置到listeners属性中。主要使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationListener。

  4. 推断并设置main方法的定义类,找到运行的主类。

SpringApplication的构造器:

java 复制代码
public SpringApplication(ResourceLoader resourceLoader, Class... primarySources) {
    // ......
    this.webApplicationType = WebApplicationType.deduceFromClasspath();
    this.setInitializers(this.getSpringFactoriesInstances();
    this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
    this.mainApplicationClass = this.deduceMainApplicationClass();
}

2.调用实例的run方法

简单的说,调用run()方法就是根据配置内容,确定哪些配置生效的过程。

主干调用主要有以下几步:

  1. 收集各种条件和回调接口,包括SpringApplicationRunListener等。调用它们的started()方法。

  2. 创建并配置当前Spring Boot应用将要使用的Environment。并调用environmentPrepared(),表明环境已经准备完毕。

  3. 创建并初始化ApplicationContext。包括设置环境,加载配置等。并调用SpringApplicationRunListener的contextPrepared()方法和contextLoaded()方法。

    注意:这一步会将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到已经准备完毕的ApplicationContext。

  4. 调用ApplicationContext的refresh()方法,完成程序启动。

  5. 遍历执行SpringApplicationRunListener的finished()方法。

此外,在初始化过程中,还有很多额外的扩展点,比如在第二步完成后,如果SpringApplication的showBanner属性被设置为true,则打印banner。

以下示例演示了 SpringApplication 如何在启动时调用 run() 方法:

java 复制代码
public class SpringApplication {

    public static void run(Class<?> primarySource, String[] args) {
        SpringApplication application = new SpringApplication(primarySource);
        SpringApplicationBuilder builder = application.createSpringApplicationBuilder();

        // 设置应用程序环境

        ConfigurableApplicationContext context = builder.run(args);

        // 应用程序已启动,可以执行自定义逻辑

        context.close();
    }

    // 其他方法
}

在这个示例中,run() 方法首先创建一个 SpringApplication 实例。然后,它使用 SpringApplicationBuilder 设置应用程序环境并创建应用程序上下文。最后,它调用应用程序上下文的 run() 方法来启动应用程序。


总结

以上就是对Spring Boot的核心原理和工作原理的介绍,通过上面的学习,可以更好地理解Spring Boot框架是如何设计和运作的,并更加高效地开发应用程序。

参考文档:

1、SpringBoot运行原理分析

2、Spring Boot 运作原理

3、Spring Boot工作原理

如果这篇博客对大家有所帮助,我希望能得到各位的免费点赞收藏,作为对我的鼓励和支持。

同时,也请大家在评论区留下您宝贵的意见和建议,我将非常欢迎。

感谢大家的支持评论收藏!!!

相关推荐
凡人的AI工具箱7 分钟前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang
陈王卜10 分钟前
django+boostrap实现发布博客权限控制
java·前端·django
小码的头发丝、10 分钟前
Spring Boot 注解
java·spring boot
午觉千万别睡过13 分钟前
RuoYI分页不准确问题解决
spring boot
java亮小白199715 分钟前
Spring循环依赖如何解决的?
java·后端·spring
飞滕人生TYF22 分钟前
java Queue 详解
java·队列
2301_8112743132 分钟前
大数据基于Spring Boot的化妆品推荐系统的设计与实现
大数据·spring boot·后端
武子康43 分钟前
大数据-230 离线数仓 - ODS层的构建 Hive处理 UDF 与 SerDe 处理 与 当前总结
java·大数据·数据仓库·hive·hadoop·sql·hdfs
武子康1 小时前
大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本
java·大数据·数据仓库·hive·hadoop·mysql
苏-言1 小时前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring