关于springboot的底层原理自己的理解

Spring Boot 底层源码解析

1 Spring Boot 简介

Spring Boot 是一个基于 Spring 框架的快速开发工具,它通过约定大于配置的理念简化了 Spring 的开发流程。Spring Boot 的核心目标是让开发者更容易地创建独立的、生产级的应用程序。

2 核心特性

自动配置(Auto Configuration):Spring Boot 根据类路径上的依赖自动配置 Spring 应用。

起步依赖(Starter Dependencies):通过预定义的依赖组合简化了 Maven 或 Gradle 的依赖管理。

嵌入式容器:默认内置 Tomcat、Jetty 或 Undertow,无需部署 WAR 文件。

Actuator:提供生产级的监控和管理功能。

外部化配置(Externalized Configuration):支持从多种来源(如 application.properties、环境变量等)加载配置。

3 启动流程

3.1主类启动

Spring Boot 应用通常以一个带有 @SpringBootApplication 注解的主类启动:

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

3.2 SpringApplication.run() 方法

初始化 SpringApplication 实例:
设置 ApplicationContext 类型(如 AnnotationConfigApplicationContext)。
加载 ApplicationContextInitializer 和 ApplicationListener。
运行 run() 方法:
创建 ConfigurableApplicationContext。
准备 Environment。
执行 SpringApplicationRunListener 的 starting() 方法。
加载应用上下文。
执行 SpringApplicationRunListener 的 started() 方法。
调用 ApplicationRunner 和 CommandLineRunner。

SpringApplication.run(Application.class, args) 是 Spring Boot 启动的入口方法。我们来看一下它的源码:
public static ConfigurableApplicationContext run(Class<?> primarySource, String[] args) {
    return run(new Class<?>[] { primarySource }, args);
}

run 方法会创建 SpringApplication 实例并调用其 run 方法:

public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
    this.resourceLoader = resourceLoader;
    Assert.notNull(primarySources, "PrimarySources must not be null");
    this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
    this.webApplicationType = WebApplicationType.deduceFromClasspath();
    setInitializers((Collection) getSpringFactoriesInstances(
        ApplicationContextInitializer.class));
    setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
    this.mainApplicationClass = deduceMainApplicationClass();
}

3.3自动配置机制源码解析

3.3.1@EnableAutoConfiguration

@EnableAutoConfiguration 注解会触发自动配置机制。它的核心是 AutoConfigurationImportSelector,它会从 META-INF/spring.factories 中读取所有自动配置类。

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
}
。

AutoConfigurationImportSelector 会从 META-INF/spring.factories 中读取所有 EnableAutoConfiguration 的实现类,并根据条件注解决定是否加载这些类。

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
            getBeanClassLoader());
    Assert.notEmpty(configurations, "No auto configuration classes found");
    return configurations;
}

spring.factories 文件中定义了所有自动配置类,例如:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration

3.3.2条件注解

Spring Boot 使用条件注解来决定是否应用某个自动配置类。常见的条件注解包括:
@ConditionalOnClass:当类路径上存在指定类时生效。
@ConditionalOnMissingClass:当类路径上不存在指定类时生效。
@ConditionalOnBean:当容器中存在指定 Bean 时生效。
@ConditionalOnMissingBean:当容器中不存在指定 Bean 时生效。
例如,DataSourceAutoConfiguration 会检查类路径上是否存在 HikariDataSource:

@Configuration
@ConditionalOnClass({ HikariDataSource.class })
@ConditionalOnMissingBean(DataSource.class)
public class DataSourceAutoConfiguration {
    // 自动配置数据源
}

posted @ 2025-07-20 22:49  mz456  阅读(28)  评论(0)    收藏  举报