关于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 {
// 自动配置数据源
}

浙公网安备 33010602011771号