Spring Boot 的启动过程解析

Spring Boot 的启动过程可以总结为以下几个主要步骤:

加载主要配置类:

Spring Boot 的入口是一个主要的配置类,通常是带有 @SpringBootApplication 注解的类。在启动过程中,Spring Boot 首先会加载这个配置类。

创建 Spring 应用上下文:

Spring Boot 使用 Spring 的核心容器,即应用上下文(Application Context)来管理和组织组件。在启动过程中,Spring Boot 会创建一个根应用上下文,并将主要配置类加载到这个应用上下文中。

执行自动配置:

Spring Boot 的核心功能之一是自动配置(Auto-configuration),它通过条件化配置来根据应用的依赖和配置来自动装配和配置各种功能和组件。在启动过程中,Spring Boot 会根据配置和类路径上的依赖,自动配置各种功能,如数据库连接、Web MVC、安全性等。

执行启动器(Starters):

Spring Boot 提供了一系列的启动器,它们是一组预配置的依赖关系,可以快速启动特定类型的应用。启动器通过自动配置和依赖管理来简化应用的搭建和配置。在启动过程中,Spring Boot 会根据应用的类型和配置,自动加载适当的启动器。

启动 Web 容器:

如果应用是一个 Web 应用,Spring Boot 会自动启动一个嵌入式的 Web 容器(如Tomcat、Jetty等),并将应用部署到该容器中。

运行应用:

一切就绪后,Spring Boot 会开始运行应用。它会触发各种生命周期事件,调用初始化方法、执行业务逻辑等。

需要注意的是,Spring Boot 的启动过程涉及到大量的类和组件,上述步骤只是一个概括性的描述。实际上,还有许多细节和复杂的逻辑涉及到自动配置、条件化装配、依赖管理等方面

Springboot核心主要包括下面几个模块、自动配置模块、启动器、注解处理器等。

下面简要介绍一下其中的一些核心组件和关键概念:

SpringApplication:

SpringApplication 是 Spring Boot 的核心类,用于启动应用和初始化 Spring 环境。它负责创建和配置 Spring 应用上下文,加载自动配置,执行初始化和刷新等操作。

自动配置(Auto-configuration):

Spring Boot 的自动配置是通过条件化配置实现的。它基于应用的依赖和配置来自动装配和配置各种功能和组件,使开发人员无需手动配置大量的细节。自动配置通过 @Conditional 注解和条件判断来决定是否应用某个配置。

启动器(Starters):

Spring Boot 的启动器是一组预配置的依赖关系,可以方便地快速启动特定类型的应用。启动器简化了项目的依赖管理,它们包含了所需的各种依赖和配置,通过简单地引入启动器,可以轻松地集成特定的功能和模块。

Spring Boot Actuator:

Spring Boot Actuator 提供了丰富的运行时管理和监控功能,可以监控应用的健康状态、性能指标、日志输出等。它通过暴露 RESTful 接口和端点来与应用进行交互,方便运维人员进行监控和管理。

条件化装配(Conditional Annotation):

Spring Boot 使用条件化装配来根据不同的条件来决定是否装配某个组件或配置。条件化装配可以基于配置属性、类路径、Bean 的存在性等多种条件进行判断,通过 @Conditional 注解来标记条件。

Spring Boot 注解处理器:

Spring Boot 使用注解处理器来处理注解,根据注解的信息进行相应的操作。例如,@SpringBootApplication 注解会触发自动配置、组件扫描等操作,@ConfigurationProperties 注解用于绑定配置属性等。

外部化配置(Externalized Configuration):

Spring Boot 支持将配置属性从代码中外部化,可以通过多种方式进行配置,如配置文件、环境变量、命令行参数等。外部化配置使得应用的配置更加灵活和可管理。

这只是对 Spring Boot 源码的一个简要介绍,实际的源码结构更为复杂,涉及到大量的类、接口和设计模式

下面提供一个简单的示例,介绍一下 Spring Boot 的核心源码结构和一些关键概念。

让我们以 SpringApplication 类为例进行源码分析。SpringApplication 是 Spring Boot 的核心类,负责应用的启动和初始化。以下是简化的示例源码:

public class SpringApplication {

    public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
        // 创建应用上下文
        ConfigurableApplicationContext context = createApplicationContext(primarySource);
        
        // 准备启动参数
        ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);

        // 准备环境配置
        configureEnvironment(context, applicationArguments);

        // 执行应用上下文初始化
        prepareContext(context, applicationArguments);
        
        // 刷新应用上下文
        refreshContext(context);

        // 执行应用
        runCommandLineRunners(context);
        
        return context;
    }

    private static ConfigurableApplicationContext createApplicationContext(Class<?> primarySource) {
        // 创建适当类型的应用上下文(根据主要配置类的类型决定)
        // ...
        return context;
    }
    
    // 其他方法...
}

上述代码是简化的示例,展示了 SpringApplication 类的主要逻辑。它通过调用一系列方法,完成了应用的创建、初始化、配置和执行。以下是代码的大致解释:

run() 方法是应用的入口,接受主要配置类和启动参数作为参数。它负责创建应用上下文,并依次调用其他方法进行初始化和执行。

createApplicationContext() 方法根据主要配置类的类型创建适当类型的应用上下文。具体类型取决于应用的类型(如 Web 应用、测试应用等)。

configureEnvironment() 方法用于配置应用上下文的环境。它基于启动参数和配置文件等,将相应的配置信息加载到应用的环境中。

prepareContext() 方法用于准备应用上下文。它执行一些准备工作,如注册 BeanFactoryPostProcessor、BeanPostProcessor 等。

refreshContext() 方法用于刷新应用上下文。它触发应用上下文的刷新操作,加载 Bean 定义、解析依赖关系等。

runCommandLineRunners() 方法用于执行应用上下文中的 CommandLineRunner 实例。这些实例可以在应用启动后执行一些特定的任务。

上述代码只是简单介绍了 SpringApplication 类的核心逻辑

除了 SpringApplication,还有其他一些核心类在 Spring Boot 的源码中起着重要的作用。以下是其中一些核心类的简要介绍:

SpringBootConfigurationLoader:该类用于加载 Spring Boot 的配置信息。它负责读取主要配置类上的注解,解析配置信息并创建相应的配置元数据。

AutoConfigurationPackages:该类用于获取自动配置类的基础包。它根据应用上下文中已经存在的 Bean 来确定基础包,以便自动配置类可以扫描到这些包。

AutoConfigurationMetadataLoader:该类负责加载和解析自动配置类的元数据。它从类路径下的 META-INF/spring-autoconfigure-metadata.properties 文件中读取自动配置类的元数据信息。

AutoConfigurationImportSelector:该类实现了 ImportSelector 接口,用于动态地导入自动配置类。它根据条件判断和配置属性来确定要导入哪些自动配置类。

ConditionEvaluator:该类用于评估条件注解的条件是否满足。它根据条件注解的信息和当前环境的条件,判断是否应该进行相应的装配或配置。

SpringApplicationRunListener:该接口定义了应用启动过程中的监听器。通过实现该接口,可以在不同的启动阶段监听和处理相应的事件。

EmbeddedWebServerFactoryCustomizerBeanPostProcessor:该类是一个 BeanPostProcessor,用于自定义嵌入式 Web 服务器工厂。它可以在应用启动时对嵌入式 Web 服务器进行自定义配置。

以上只是其中一部分核心类的简要介绍,Spring Boot 源码中还有更多的类和组件,每个都有其具体的功能和用途

SpringBootConfigurationLoader 是 Spring Boot 源码中的一个重要类,它负责加载 Spring Boot 的配置信息。在 Spring Boot 中,主要配置类上的注解被用作配置信息的源,通过 SpringBootConfigurationLoader 进行解析和处理。

以下是对 SpringBootConfigurationLoader 的详细解析:

加载配置信息:

SpringBootConfigurationLoader 使用 load() 方法加载配置信息。该方法接收主要配置类的 Class 对象作为参数,并返回一个 ConfigurationMetadata 对象,其中包含了配置信息的元数据。
在加载配置信息之前,会先检查是否已经缓存了相应的元数据,如果已经缓存,则直接返回缓存的元数据对象。
如果没有缓存,则调用 load() 方法开始加载配置信息。
解析配置信息:

在 load() 方法中,首先获取主要配置类上的注解信息。通过 AnnotationUtils.getAnnotations() 方法获取主要配置类上的所有注解。
遍历注解列表,对每个注解进行解析。SpringBootConfigurationLoader 会识别 Spring Boot 相关的注解,如 @SpringBootApplication、@EnableAutoConfiguration 等。
对于识别出的注解,会根据注解的属性和元数据规则进行解析,生成相应的配置元数据对象。
创建配置元数据:

在解析过程中,根据注解的属性和元数据规则,创建相应的配置元数据对象。配置元数据对象是 ConfigurationMetadata 的实例。
配置元数据对象包含了配置属性的信息,如属性名称、类型、默认值、描述等。
缓存配置元数据:

在解析和创建配置元数据对象后,将其缓存起来,以便下次加载时可以直接使用缓存的元数据。
SpringBootConfigurationLoader 使用 ConfigurationMetadataRepository 进行元数据的缓存和管理。
SpringBootConfigurationLoader 的作用是将主要配置类上的注解信息解析为配置元数据,为后续的自动配置、环境配置等提供基础。通过加载和解析配置信息,Spring Boot 可以根据配置属性进行自动装配和配置。

这是对 SpringBootConfigurationLoader 的简要解析,实际的源码实现更为复杂,涉及到注解解析、元数据生成等具体细节

AutoConfigurationPackages 是 Spring Boot 源码中的一个实用工具类,用于获取自动配置类的基础包。它在自动配置过程中起到了重要的作用,确保自动配置类能够扫描到正确的包路径。

以下是对 AutoConfigurationPackages 的详细解析:

获取基础包:

AutoConfigurationPackages 提供了静态方法 get(),用于获取自动配置类的基础包。基础包是指已经存在的 Bean 所在的包路径。
get() 方法首先尝试从缓存中获取已经计算过的基础包路径。如果缓存中存在,直接返回缓存的结果。
如果缓存中不存在,通过调用 getPackageName() 方法获取基础包路径。
计算基础包路径:

getPackageName() 方法通过 ClassUtils 工具类中的 forName() 方法,传入已知的 Bean 的全限定类名来获取 Bean 的 Package 对象。
从 Package 对象中获取包的名称,即基础包路径。
如果无法获取包对象或包名称,则抛出异常。
缓存基础包路径:

在成功计算出基础包路径后,将其缓存起来,以便下次获取基础包路径时可以直接使用缓存的结果。
AutoConfigurationPackages 使用 ConfigurationClassUtils 工具类中的 registerCacheAwareComponentScanPackages() 方法来缓存基础包路径。
AutoConfigurationPackages 的作用是为自动配置类提供基础包路径。通过获取基础包路径,Spring Boot 可以确保自动配置类能够扫描到正确的包路径,从而进行自动配置的装配。

需要注意的是,基础包路径的计算是基于已经存在的 Bean 来确定的。因此,在使用 AutoConfigurationPackages 之前,必须保证已经存在一些 Bean,以便确定基础包路径。

这是对 AutoConfigurationPackages 的简要解析,实际的源码实现可能涉及到更多细节和边缘情况

内容过多,其他核心类,下次再介绍!!!!

猜你喜欢

转载自blog.csdn.net/yuanchengfu0910/article/details/130892977
今日推荐