目录
一 自动配置
1:数据源的手动配置
1:SpringBoot的自动配置
二 自动配置的完整流程:(底层)
1. 场景化依赖与Starter机制
2. 主程序入口与注解驱动
3. 自动配置类的加载与筛选
4. 自动配置类的实现逻辑
5. 自动配置的触发与执行流程
6. 自动配置的优势
补充:关键配置文件与调试技巧
三 自动配置类的实现:
1. 启动类与核心注解
2. 加载自动配置类
3. 条件化装配
4. 配置属性绑定
5. 组件创建与注入
6. 结果整合
核心优势
概念
SpringBoot帮我们简单快速的创建一个独立的、生产级别的Spring应用;
1 核心特性
-
简化配置
-
自动配置(Auto-Configuration):根据类路径中的依赖自动配置 Spring 应用。例如,引入
spring-boot-starter-data-jpa
后,Spring Boot 会自动配置数据源和 JPA 相关 Bean。 -
外部化配置:支持通过
application.properties
/application.yml
、环境变量或命令行参数灵活配置应用,并支持多环境(如dev
/prod
)配置。
-
-
内嵌服务器
-
默认集成 Tomcat,也可选择 Jetty 或 Undertow。无需部署 WAR 包,直接打包为可执行 JAR 文件,通过
java -jar
命令运行。
-
-
起步依赖(Starter Dependencies)
-
提供预定义的依赖集合(如
spring-boot-starter-web
包含 Spring MVC、Tomcat 等),简化 Maven/Gradle 依赖管理,避免版本冲突。
-
-
生产就绪功能(Spring Boot Actuator)
-
提供监控和管理端点(如
/health
、/metrics
),支持健康检查、性能指标收集和日志管理,便于运维。
-
-
开发者工具(DevTools)
-
支持热部署、自动重启和实时重新加载,提升开发效率。
-
-
集成测试支持
-
提供
@SpringBootTest
进行全栈集成测试,以及@WebMvcTest
、@DataJpaTest
等切片测试注解,简化测试流程。
-
一 自动配置
手动配置大于自动配置
概念:基于项目的依赖和类路径中的内容,自动配置 Spring 应用所需的组件。
1:数据源的手动配置
<!-- 导入druid的依赖 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency>
数据源配置(人为手动的引用配置文件当中的信息)
package org.example.springmvc.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class DataSourceConfig {@Value("${spring.datasource.username}")private String username;@Value("${spring.datasource.password}")private String password;@Value("${spring.datasource.driver-class-name}")private String driverClassName;@Value("${spring.datasource.url}")private String url;@Beanpublic DruidDataSource dataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setUsername(username);dataSource.setPassword(password);dataSource.setDriverClassName(driverClassName);dataSource.setUrl(url);return dataSource;}}
1:SpringBoot的自动配置
当项目引入 Spring Boot 的数据库相关依赖(如 spring-boot-starter-jdbc
或 spring-boot-starter-data-jpa
)时,Spring Boot 的自动配置机制会尝试根据以下逻辑处理数据库连接
-
前提条件:
必须满足以下两点,Spring Boot 才会自动配置默认数据源(如 HikariCP):-
项目中存在数据库驱动依赖(如
mysql-connector-java
)。 -
配置文件中提供了 数据库连接四要素(URL、用户名、密码、驱动类名)
-
- 默认行为:
Spring Boot 会基于上述配置自动创建数据源(默认使用 HikariCP),无需手动编写 @Bean
配置类。
配置文件当中指定配置类型
这种不直接指定的默认Hikari
如果在配置文件当中指定
会使用你指定的类型
二 自动配置的完整流程:
关于Spring Boot的自动配置机制,我的理解可以总结为以下几个核心要点:
1. 场景化依赖与Starter机制
-
场景选择:通过选择不同的Starter依赖(如
spring-boot-starter-web
),Spring Boot会自动引入该场景所需的全部依赖库(如Tomcat、Spring MVC、Jackson等)。这相当于声明了项目的功能需求,例如Web开发需要内嵌服务器和HTTP处理能力。 -
依赖传递:所有Starter都继承自
spring-boot-starter
,它提供了核心库(如spring-core
)、日志框架(SLF4J + Logback)以及自动配置的基础支持(spring-boot-autoconfigure
)。
2. 主程序入口与注解驱动
-
@SpringBootApplication
:这是组合注解,包含三个关键功能:-
@SpringBootConfiguration
:标识当前类为配置类,等价于@Configuration
,用于定义Bean。 -
@EnableAutoConfiguration
:启用自动配置的核心开关,触发AutoConfigurationImportSelector
加载自动配置类。 -
@ComponentScan
:自动扫描当前包及其子包下的组件(@Component
、@Service
等),将它们注册为Bean。
-
3. 自动配置类的加载与筛选
-
AutoConfigurationImportSelector
:该类负责加载所有预定义的自动配置类。具体流程如下:-
定位配置文件:从所有依赖的JAR包中查找
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件。 -
批量导入配置类:读取文件中列出的全限定类名(如
WebMvcAutoConfiguration
、DataSourceAutoConfiguration
等)。 -
条件化筛选:每个自动配置类通过
@Conditional
系列注解(如@ConditionalOnClass
、@ConditionalOnMissingBean
)判断是否生效。例如:-
@ConditionalOnClass(DataSource.class)
:仅在类路径存在DataSource
类时生效。 -
@ConditionalOnMissingBean(DataSource.class)
:仅在用户未手动定义DataSource
Bean时生效。
-
-
4. 自动配置类的实现逻辑
-
配置类结构:每个自动配置类(如
DataSourceAutoConfiguration
)通过@Bean
方法定义组件,并配合条件注解控制是否生效。 -
默认值设置:自动配置类会读取
application.properties
中的配置项(如spring.datasource.url
),若用户未配置则使用合理的默认值。 -
优先级规则:用户手动定义的Bean优先级高于自动配置类,实现灵活覆盖。
5. 自动配置的触发与执行流程
-
项目启动:执行主类的
main
方法,初始化Spring上下文。 -
加载自动配置类:通过
AutoConfigurationImportSelector
加载所有符合条件的配置类。 -
条件化装配:依次执行每个自动配置类,根据条件注解决定是否创建Bean。
-
Bean注册:最终将所有符合条件的Bean注册到IoC容器中,完成依赖注入。
6. 自动配置的优势
-
减少样板代码:无需手动配置
DispatcherServlet
、DataSource
等通用组件。 -
按需加载:仅加载与当前场景相关的配置类(如未引入Redis依赖,则相关配置类不生效)。
-
高扩展性:用户可通过自定义Bean或配置文件覆盖默认行为。
补充:关键配置文件与调试技巧
-
自动配置列表:
AutoConfiguration.imports
文件中列出了所有自动配置类,位置在spring-boot-autoconfigure
包的META-INF/spring
目录下。 -
调试日志:启动时添加
-Ddebug
参数,控制台会输出所有自动配置类的生效与排除原因,便于排查问题。
三句话概括:
- 1 场景启动器一导入,就从META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中导入一大堆自动配置类(类XxxAutoConfiguration)
- 2 这些xxxAutoConfiguration基于@conditional条件注解导入一堆组件
- 3 业务就可以使用这些组件了
类路径下的文件
三 自动配置类的实现:
1. 启动类与核心注解
项目启动时,主类上的 @SpringBootApplication
注解触发自动配置。该注解整合了三个核心功能:
-
配置类声明:标记主类为Spring的配置类。
-
组件扫描:自动探测并注册当前包下的组件(如Service、Controller)。
-
启用自动配置:激活Spring Boot的自动配置机制。
2. 加载自动配置类
-
自动配置列表:Spring Boot内置了上百个自动配置类(如
DataSourceAutoConfiguration
、WebMvcAutoConfiguration
),这些类定义在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件中。 -
按需加载:通过
AutoConfigurationImportSelector
筛选并加载这些配置类,但并非全部生效,需通过条件判断。
3. 条件化装配
每个自动配置类通过 @Conditional
系列注解 控制是否生效,例如:
-
存在类时生效:如检测到类路径中有
DataSource
类,才加载数据源配置。 -
无自定义Bean时生效:若用户未手动定义某个Bean(如
DataSource
),才使用默认配置。 -
配置属性匹配时生效:如根据
spring.datasource.url
是否存在决定是否初始化数据库连接。
4. 配置属性绑定
-
属性映射:通过
@ConfigurationProperties
将配置文件(如application.properties
)中的属性(如spring.datasource.url
)绑定到Java对象。 -
动态适配:自动配置类读取这些属性值,用于初始化组件(如数据库连接池的URL、用户名)。
5. 组件创建与注入
-
默认Bean创建:自动配置类通过内部逻辑创建标准化的Bean(如
DataSource
、DispatcherServlet
)。 -
用户自定义优先:若用户手动定义了同名Bean(如自己写的
@Bean DataSource
),则覆盖默认实现。
6. 结果整合
所有生效的自动配置类共同作用,最终完成以下工作:
-
依赖管理:根据项目引入的Starter(如
spring-boot-starter-web
)按需加载功能模块。 -
组件装配:自动注册Bean到Spring容器,如内嵌Tomcat、JSON解析器、数据库连接池等。
-
环境适配:结合配置文件中的参数,动态调整组件行为(如连接池大小、超时时间)。
核心优势
-
开箱即用:无需手动配置常见功能(如Web服务器、数据库连接)。
-
按需加载:仅初始化与当前依赖和配置匹配的功能模块,避免资源浪费。
-
灵活扩展:用户可通过配置文件或自定义Bean轻松覆盖默认行为。
两句话:
- 1 把属性类和配置列进行绑定
- 2 组件要用的所有属性放到容器中