Spring Boot 原理解析

本文详细解析了SpringBoot项目的启动过程,从入口类的@SpringBootApplication注解到SpringApplication.run方法的具体执行流程,帮助读者理解SpringBoot如何初始化配置和自动装配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

本篇文章主要是看完Spring Boot 微服务项目之后开始写的一篇文章,主要是在学习Spring Boot 中的一些感悟,今天主要以Spring Boot中的原理来讲吧。


一、DemoApplication入口类

这里展示我的DemoApplication入口类:
在这里插入图片描述

@SpringBootApplication和main方法是Spring Boot自动生成的,其他注解都是我们在学习Spring Boot时整合其他技术添加上去的。接下来就和大家一起看看@SpringBootApplication和SpringApplication.run方法到底为我们做了些什么。

二、@SpringBootApplication的原理

@SpringBootApplication开启了Spring的组件扫描和Spring Boot自动配置功能。实际上它是一个复合注解,包含3个重要的注解:@SpringBootConfiguration、@ EnableAutoConfiguration、@ComponentScan,其源代码如下:
在这里插入图片描述

@SpringBootConfiguration注解:标明该类使用Spring基于Java的注解,SpringBoot推荐我们使用基于Java而不是XML的配置,查看@SpringBootConfiguration源代码,可以看到它对@Configuration进行了简单的“包装”,然后取名为SpringBootConfiguration。@SpringBootConfiguration源代码如下:
在这里插入图片描述

我们对@Configuration注解并不陌生,它就是JavaConfig形式的Spring IoC容器的配置类使用的@Configuration。
@EnableAutoConfiguration注解:该注解可以开启自动配置的功能。@EnableAutoConfiguration具体源代码如下:
在这里插入图片描述
从@EnableAutoConfiguration的源代码可以看出,其包含@Import注解。而我们知道,@Import注解的主要作用就是借助EnableAutoConfigurationImportSelector将Spring Boot应用所有符合条件的@Configuration配置都加载到当前Spring Boot创建并使用的Ioc容器中,Ioc容器就是我们所说的Spring应用程序上下文ApplicationContext。学习过Spring框架就知道,Spring框架提供了很多@Enable开头的注解定义,比如@EnableScheduling、@EnableCaching等。而这些@Enable开头的注解都有一个共同的功能,就是借助@Import的支持收集和注册特定场景相关的bean定义。

@ComponentScan注解:启动组件扫描,开发的组件或bean定义能被自动发现并注入Spring应用程序上下文。比如我们在控制层添加@Controller注解、在服务层添加@Service注解和@Component注解等,这些注解都可以被@ComponentScan注解扫描到。

1.SpringApplication的run方法

除了@SpringBootApplication注解外,我们发现了入口类的一个显眼的地方,那就是SpringApplication.run方法。在run方法中,首先创建一个SpringApplication对象实例,然后调用SpringApplication的run方法。SpringApplication.run方法的源代码如下:

public class SpringApplication {
/*部分代码省去*/
public ConfigurableApplicationContext run(String... args) {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        DefaultBootstrapContext bootstrapContext = this.createBootstrapContext();
        ConfigurableApplicationContext context = null;
        this.configureHeadlessProperty();
        SpringApplicationRunListeners listeners = this.getRunListeners(args);
        listeners.starting(bootstrapContext, this.mainApplicationClass);

        try {
            ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
            ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments);
            this.configureIgnoreBeanInfo(environment);
            Banner printedBanner = this.printBanner(environment);
            context = this.createApplicationContext();
            context.setApplicationStartup(this.applicationStartup);
            this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
            this.refreshContext(context);
            this.afterRefresh(context, applicationArguments);
            stopWatch.stop();
            if (this.logStartupInfo) {
                (new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);
            }

            listeners.started(context);
            this.callRunners(context, applicationArguments);
        } catch (Throwable var10) {
            this.handleRunFailure(context, var10, listeners);
            throw new IllegalStateException(var10);
        }

        try {
            listeners.running(context);
            return context;
        } catch (Throwable var9) {
            this.handleRunFailure(context, var9, (SpringApplicationRunListeners)null);
            throw new IllegalStateException(var9);
        }
    }
    }


}

里面大致是首先开启了一个监听器,然后就是通过createBootstrapContext创建上下文,最后通过上下文配置所需要的类和各种环境等。大致好像是这样的,这里我可能说的很不全面,有看到的小伙伴,可以留言交流嘛。

三. SpringApplication执行流程

在这里插入图片描述
1.首先启动时调入入口类DemoApplication的mian方法
2.在mian方法中调用静态方法run
3.创建SpringApplication实例,在对象实例中调用run方法
4.查询和加载监听器对象
5.创建和准备SpringBoot所需要的环境,包括配置文件等。
6.创建和初始化应用上下文ApplicationContext。这一步只是准备工作,并未开始正式创建。
7.Spring Boot会通过@EnableAutoConfiguration获取所有配置以及其他形式的Ioc容器配置,并加载到已经准备完毕的ApplicationContext。
8.调用ApplicationContextInitializer类的initialize方法对应用上下文进行设置和处理
9.刷新ApplicationContext,使Ioc容器达到可用状态。
10.查找当前ApplicationContext上下文是否注册ApplicationRunner与CommandLineRunner,如果有,循环遍历执行ApplicationRunner和CommandLineRunner的run方法。
11.执行SpringApplicationListener的finished方法,Spring Boot应用启动完毕。

总结

大致原理也就是这样了,后面我会继续更新关于spring-boot-starter原理,知识多数来自于书本上的东西,我只是简单整理了一下,关于本篇文章,主要参考来自于黄文毅先生的书《一步一步学SpringBoot 微项目实战(第二版)》。
关于书籍来源可以参考:https://huangwenyi.blog.youkuaiyun.com/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值