跨 2 个组件的多个数据源

Multiple DataSources across 2 components

我有 2 个 Spring 引导应用程序 App1App2App2 可以 运行 作为独立的应用程序,也可以作为依赖嵌入到应用程序 App1 中。我希望 App1 能够调用 App2 的服务,从而对不同的数据库进行回购调用。我在两个组件中配置了 DataSource bean,如下所示:

App1

  @Configuration
  @EnableJpaRepositories(basePackages = "com.ev.app1.repositories",
  entityManagerFactoryRef = "app1EntityManagerFactory",
  transactionManagerRef = "app1TransactionManager")
  public class PersistenceApp1Configuration {
    @Bean
    @ConfigurationProperties(prefix = "app.datasource.app1")
    public DataSourceProperties app1DataSourceProperties() {
      return new DataSourceProperties();
    }

    @Bean(name = "app1DataSource")
    @ConfigurationProperties(prefix = "app.datasource.app1")
    public DataSource tmDataSource() {
      return tmDataSourceProperties().initializeDataSourceBuilder()
      .type(BasicDataSource.class).build();
    }

App1 application.properties:

app.datasource.app1.url=jdbc:postgresql://localhost:5432/mercury_tmdb?currentSchema=txm
app.datasource.app1.username=postgres
app.datasource.app1.password=root
app.datasource.app1.driverClassName=org.postgresql.Driver

App2

  @Configuration
  @EnableJpaRepositories(basePackages = "com.ev.app1.repositories",
  entityManagerFactoryRef = "app1EntityManagerFactory",
  transactionManagerRef = "app1TransactionManager")
  public class PersistenceApp1Configuration {
    @Bean
    @ConfigurationProperties(prefix = "app.datasource.app1")
    public DataSourceProperties app1DataSourceProperties() {
      return new DataSourceProperties();
    }

    @Bean(name = "app2DataSource")
    @Primary
    @ConfigurationProperties(prefix = "app.datasource.app2")
    public DataSource app2DataSource() {
    return tmDataSourceProperties().initializeDataSourceBuilder()
      .type(BasicDataSource.class).build();
    }

App2 application.properties:

app.datasource.app2.url=jdbc:postgresql://localhost:5432/mercury_cldb?currentSchema=led
app.datasource.app2.username=postgres
app.datasource.app2.password=root
app.datasource.app2.driverClassName=org.postgresql.Driver

如您所见,我必须将 App2 中的 DataSource bean 标记为 @Primary 以覆盖默认的 spring 数据源。但是我不能为 App1 做同样的事情,因为它已经有一个来自 App2 的主 bean。有什么解决办法吗?或者我可能完全不喜欢这种方法?

注意:我还有其他配置 bean,我没有在此处显示,但如果需要我可以共享

您可以使用 Spring 中的条件 bean 配置,因此您可以决定何时使用每个数据源。

您可以像这样使用注释:

@ConditionalOnExpression(value = "${module.enabled} and ${module.submodule.enabled}")

取决于您的具体配置。