程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了有条件地覆盖 springboot 中的默认数据源大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决有条件地覆盖 springboot 中的默认数据源?

开发过程中遇到有条件地覆盖 springboot 中的默认数据源的问题如何解决?下面主要结合日常开发的经验,给出你关于有条件地覆盖 springboot 中的默认数据源的解决方法建议,希望对你解决有条件地覆盖 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();
  }

大佬总结

以上是大佬教程为你收集整理的有条件地覆盖 springboot 中的默认数据源全部内容,希望文章能够帮你解决有条件地覆盖 springboot 中的默认数据源所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: