Spring Boot 多数据源与事务管理深度解析:从原理到实践
引言
在现代企业级应用开发中,多数据源的需求日益普遍。无论是数据库读写分离、多租户架构,还是异构数据源集成,都需要我们掌握在 Spring Boot 中配置和管理多数据源的技术。本文将深入探讨 Spring Boot 数据源和事务的加载原理,并详细讲解多种实现多数据源的方案,特别是如何保证动态数据源切换的正确性。
第一部分:Spring Boot 数据源与事务加载原理
1.1 数据源自动配置机制
依赖触发 → 自动配置 → Bean创建 → 应用启动
核心组件分工:
- spring-boot-starter-*:依赖管理,召集相关组件
- spring-jdbc:提供核心 API 和编程模型
- spring-boot-autoconfigure:自动配置逻辑的实现者
数据源加载详细流程:
// 1. 触发条件:类路径存在 DataSource.class
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {// 2. 配置属性绑定@ConfigurationProperties(prefix = "spring.datasource")public class DataSourceProperties {private String url;private String username;private String password;// ...}// 3. 数据源创建(默认HikariCP)@ConditionalOnMissingBean(DataSource.class)@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource", matchIfMissing = true)static class Hikari {@Bean@ConfigurationProperties(prefix = "spring.datasource.hikari")HikariDataSource dataSource(DataSourceProperties properties) {return properties.initializeDataSourceBuilder().type(HikariDataSource.class).build();}}
}
1.2 事务管理加载原理
事务管理的核心是 AOP 代理机制:
// 事务自动配置
@ConditionalOnClass(PlatformTransactionManager.class)
public class TransactionAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic PlatformTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}// 事务顾问配置
@Configuration
@ConditionalOnBean(PlatformTransactionManager.class)
public class InfrastructureAdvisorAutoConfiguration {@Beanpublic BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor(TransactionAttributeSource transactionAttributeSource,TransactionInterceptor transactionInterceptor) {// 创建事务切面顾问return advisor;}@Beanpublic TransactionInterceptor transactionInterceptor() {// 创建事务拦截器return interceptor;}
}
事务执行流程:
- 为被 @Transactional 注解的 Bean 创建代理2. 方法调用时被 TransactionInterceptor 拦截3. 拦截器调用 PlatformTransactionManager 管理事务
- 执行目标业务方法
- 根据执行结果提交或回滚事务
第二部分:MyBatis 多数据源实现方案
2.1 手动配置多数据源(生产推荐)
项目结构规划:
src/main/java/
├── com/example/
│ ├── config/
│ │ ├── PrimaryDataSourceConfig.java
│ │ └── SecondaryDataSourceConfig.java
│ ├── entity/
│ │ ├── primary/
│ │ └── secondary/
│ ├── mapper/
│ │ ├── primary/
│ │ └── secondary/
│ └── service/
└── resources/├── mapper/│ ├── primary/│ └── secondary/└── application.yml
配置文件:
spring:datasource:primary:jdbc-url: jdbc:mysql://localhost:3306/