使用Java枚举管理Spring Boot+MyBatis-Plus多数据源路由键是最简洁、类型安全且易维护的方式,枚举封装routingKey、databaseName、isMaster等元信息,配合AOP与DynamicDataSource实现编译期校验、IDE补全和可控路由。

在 Spring Boot + MyBatis-Plus 多数据源场景中,用 Java 枚举管理路由键(Routing Key)是最简洁、类型安全且易维护的方式。核心思路是:每个枚举常量代表一个数据源标识,同时封装其对应的数据库名、分组、权重或是否主库等元信息,再配合 DynamicDataSource 或自定义 DataSourceRouter 实现运行时切换。
定义带属性的枚举类
枚举不只是名称,要承载路由所需的关键字段,比如数据源名(key)、逻辑库名、读写类型等:
- 必须有唯一、不可变的 routingKey 字段(通常为 String),作为动态数据源查找依据
- 可扩展 databaseName、group、isMaster 等字段,便于后续做分组路由或读写分离
- 提供静态方法如
of(String key)支持运行时字符串匹配,避免硬编码和NullPointerException
示例:
public enum DataSourceKey {
MASTER("master", "db_main", true),
SLAVE01("slave01", "db_report", false),
SLAVE02("slave02", "db_analytics", false),
TENANT_A("tenant_a", "db_tenant_a", true),
TENANT_B("tenant_b", "db_tenant_b", true);
<pre class="brush:php;toolbar:false;">private final String routingKey;
private final String databaseName;
private final boolean isMaster;
DataSourceKey(String routingKey, String databaseName, boolean isMaster) {
this.routingKey = routingKey;
this.databaseName = databaseName;
this.isMaster = isMaster;
}
public String getRoutingKey() { return routingKey; }
public String getDatabaseName() { return databaseName; }
public boolean isMaster() { return isMaster; }
public static DataSourceKey of(String key) {
for (DataSourceKey item : values()) {
if (item.routingKey.equals(key)) {
return item;
}
}
throw new IllegalArgumentException("Unknown routing key: " + key);
}}
在 AOP 或注解中使用枚举作为路由依据
不建议在业务代码里直接调用 DynamicDataSourceContextHolder.set(...) 字符串;应通过注解 + 枚举值解耦:
- 定义自定义注解
@TargetDataSource,参数类型为DataSourceKey枚举而非 String - AOP 切面中读取注解值,调用
DynamicDataSourceContextHolder.set(key.getRoutingKey()) - 这样编译期就校验合法性,IDE 可自动补全,重构时枚举名变更会立即报错
好处:避免拼错字符串(如 "mster")、杜绝空指针、支持单元测试 Mock 枚举行为。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
结合 Tenant 或 Sharding 场景动态解析枚举
当需要根据租户 ID、请求头、线程变量等动态决定数据源时,可封装一个工厂类:
- 实现
DataSourceKeyResolver接口,内部根据上下文返回对应枚举实例 - 例如:从
RequestContextHolder获取 header 中的X-Tenant-ID,映射到TENANT_A或TENANT_B - 再将该枚举传给 AOP 或事务模板,统一设置路由键
关键点:所有分支逻辑最终都落到已定义的枚举常量上,保证路由出口可控、可审计。
与 Dynamic DataSource 框架集成要点
若使用 dynamic-datasource-spring-boot-starter(如开源的 baomidou/dynamic-datasource):
- 确保
spring.datasource.dynamic.datasource.xxx配置中的xxx名称与枚举的routingKey完全一致 - 启动时可通过
DynamicRoutingDataSource的getDataSources()校验所有枚举 key 是否已注册 - 禁用默认数据源(
primary)或设为MASTER,避免遗漏配置导致 fallback 到错误库
不复杂但容易忽略:枚举名、配置 key、代码中调用的 key 必须三位一体,枚举就是这个契约的权威定义者。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










