首页 > 解决方案 > 有条件地覆盖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;
  }
}

但是由于循环依赖,这不起作用。实施它的最佳方法是什么?

标签: springspring-boot

解决方案


SpringBoot 默认将环境变量视为属性。因此,将 @ConditionalOnProperty 与“租户”属性一起使用是有效的

  @Bean
  @ConditionalOnProperty(name = AppConstants.TENANT)
  public DataSource dataSource() {
   
    return DataSourceBuilder.create()
        .url(config.getUrl())
        .password(config.getPassword())
        .username(config.getUsername())
        .build();
  }

推荐阅读