spring - 有条件地覆盖springboot中的默认数据源
问题描述
我正在尝试以编程方式配置 spring 数据源。这个想法是如果指定了租户信息,则覆盖默认数据源,否则使用默认数据源以实现向后兼容性。我试着想出类似的东西:
@Component
@AllArgsConstructor
public class TenancyDataSource {
private TenantConfigs tenantConfigs;
private DataSource dataSource;
@Bean
public DataSource dataSource() {
String tenant = System.getenv(AppConstants.TENANT);
if (!ObjectUtils.isEmpty(tenant)) {
TenantConfigs config =
tenantConfigs
.getDataSources()
.stream()
.filter(TenantConfig -> tenantConfig.getTenantName().equals(tenant))
.findFirst()
.orElse(null);
if (!ObjectUtils.isEmpty(config)) {
return DataSourceBuilder.create()
.url(config.getUrl())
.password(config.getPassword())
.username(config.getUsername())
.build();
}
}
return dataSource;
}
}
但是由于循环依赖,这不起作用。实施它的最佳方法是什么?
解决方案
SpringBoot 默认将环境变量视为属性。因此,将 @ConditionalOnProperty 与“租户”属性一起使用是有效的
@Bean
@ConditionalOnProperty(name = AppConstants.TENANT)
public DataSource dataSource() {
return DataSourceBuilder.create()
.url(config.getUrl())
.password(config.getPassword())
.username(config.getUsername())
.build();
}
推荐阅读
- angular - 编写通用 HttpClient 包装函数
- c# - 我将如何更改我的程序,以便在方法正确后计时器停止
- python - 如何在 python 中创建单个 webdriver 实例,以便我可以在代码中的任何地方访问它?
- reverse-proxy - HAProxy http passtrough 代理而不是 304 重定向
- python-3.x - 将 JSON、HTML、XML 或文本从内存而不是文件加载到 PETL
- validation - 使用 IdentityServer4 进行多租户 Azure AD 身份验证
- c# - 如何在 VSTS 中运行特定场景而不改变我的 CI 管道
- oracle - UPDATE 查询与 RETURNING INTO 子句结合使用很慢
- python - 如何从 python 运行源代码?
- r - spark_read_csv 的 Sparklyr 尺寸问题:NA 结果