【发布时间】:2021-11-14 07:41:09
【问题描述】:
我有 2 个 Spring Boot 应用程序 App1 和 App2。 App2 可以作为独立应用程序运行,也可以作为依赖项嵌入到应用程序App1 中。我希望 App1 能够调用 App2 的服务,从而对不同的数据库进行 repo 调用。我在两个组件中都配置了 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 应用程序.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 应用程序.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 的 Primary bean。有什么解决方法吗?或者我可能完全不喜欢这种方法?
注意:我还有其他配置 bean,我没有在这里显示,但如果需要我可以分享
【问题讨论】:
-
您如何使用数据源?您是在告诉您的数据访问服务使用某些特定的还是只是使用 Spring 的默认配置?
-
@WilliamAndrésBernal 我已经添加了从中获取数据库信息的属性文件
-
我试图更好地提出我的问题。服务如何知道必须使用哪个数据源?您的代码中是否对此进行了任何配置,或者您只是让 spring 来完成它的工作?
-
我使用@EnableJpaRepositories 将包设置为扫描、EMF 和TM。我希望这能回答你的问题。也编辑了问题。
-
如果我理解正确,这两个服务都在同一个源代码存储库中?如果是这样,您可以使用 spring profile 来创建基于应用程序的数据源。 intertech.com/spring-4-conditional-bean-configuration
标签: java spring-boot hibernate datasource