繁体   English   中英

spring 引导中的动态 Bean 配置和加载

[英]Dynamic Bean configuration & loading in spring boot

我正在关注此链接以了解具有 spring 引导的六边形架构。 基础设施部分包含服务 bean 的配置,并且存储库作为参数作为以下方法传递。

配置

@Configuration
@ComponentScan(basePackageClasses = HexagonalApplication.class)
public class BeanConfiguration {

      @Bean
      BankAccountService bankAccountService(BankAccountRepository repository) {
          return new BankAccountService(repository, repository);
      }
}

我没有使用 JPA 而是使用 Spring JDBC 与 DB 交互。 链接教程使用 JPA。

可以说我有不同的数据库实现,即。 postgresql(BankAccountRepository) 和 db2(BankAccountDB2Rep)。 我想在不接触代码的情况下更改 bean。 像 yml 配置或者我可以单独维护而不是接触代码的东西。

BankAccountRepository.java

@Component
public class BankAccountRepository implements LoadAccountPort, SaveAccountPort {

      private SpringDataBankAccountRepository repository;

      // Constructor

      @Override
      public Optional<BankAccount> load(Long id) {
          return repository.findById(id);
      }

      @Override
      public void save(BankAccount bankAccount) {
          repository.save(bankAccount);
      }
}

如何在 spring 引导中实现相同的效果? 任何帮助表示赞赏..

您可以参考Spring 引导配置和使用两个数据源来创建多个数据源并执行以下操作。

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
  entityManagerFactoryRef = "entityManagerFactory",
  transactionManagerRef = "transactionManager",
  basePackages = {
   "com.example"
  }
)
public class JPAConfig {

    @Primary
    @Bean(name = "postgresDataSource")
    @ConfigurationProperties(prefix = "postgres.datasource")
    public DataSource postgresDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "db2DataSource")
    @ConfigurationProperties(prefix = "db2.datasource")
    public DataSource db2DataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
    EntityManagerFactoryBuilder builder,
    @Qualifier("postgresDataSource") DataSource postgresdataSource,
    @Qualifier("db2DataSource") DataSource db2dataSource,
    @Value("${useDb2}") Boolean useDb2
    ) {
        return builder
        .dataSource(useDb2? db2dataSource : postgresdataSource)
        .packages("com.example")
        .persistenceUnit("db1")
        .build();
    }

    @Primary
    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManager(
    @Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory
    ) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

正如@M.Deinum 在评论中提到的,这个问题可以通过使用spring 条件bean来解决,如下所示

@Configuration
@ConditionalOnProperty(
    value="module.enabled", 
    havingValue = "true", 
    matchIfMissing = true)
class CrossCuttingConcernModule {
  ...
}

更多信息可以在这里找到

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM