跨 2 个组件的多个数据源
Multiple DataSources across 2 components
我有 2 个 Spring 引导应用程序 App1 和 App2。 App2 可以 运行 作为独立的应用程序,也可以作为依赖嵌入到应用程序 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}")
取决于您的具体配置。
我有 2 个 Spring 引导应用程序 App1 和 App2。 App2 可以 运行 作为独立的应用程序,也可以作为依赖嵌入到应用程序 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}")
取决于您的具体配置。