我正在开发将数据持久保存到MS SQL数据库中的Spring Boot应用程序。我的任务是添加对使用相同表的PostgreSQL的支持。所以我的目标是添加另一个存储库层实现。但是事情变得有点复杂。
如果我的存储库层看起来像这样,那就太好了
public interface RecordRepository {
Record get(long id);
}
@Repository
@Conditional(MsSqlCondition.class)
public interface MsSqlRecordRepository {
public Record get(long id) {
// MS SQL implementation...
}
}
@Repository
@Conditional(PostgreSqlCondition.class)
public interface PostgreSqlRecordRepository {
public Record get(long id) {
// PostgreSql implementation...
}
}
但是,在我看来,这是不可能的。
首先,我的应用程序在application.yaml
文件中没有数据库配置。它必须从远程HTTP服务器获取这些变量。我的@Configuration
文件看起来像这样:
@Configuration
public class MyAppConfiguration {
@Bean
public DatabaseConfiguration databaseConfiguration() {
// Make HTTP request to remote server
if (something) {
return new MsSqlServerConfiguration(...);
} else {
return new PostgreSqlServerConfiguration(...);
}
}
}
使用这种方法,由于@Conditional
是在解析DataSource
文件时进行评估的,因此无法为我的@Conditional
和存储库bean使用@Configuration
注释。创建DatabaseConfiguration
bean之后,我需要选择正确的实现。
我已经考虑过这种方法:
@Configuration
public class RepositoryConfiguration {
@Bean
public RecordRepository(DatabaseConfiguration configuration, JdbcTemplate jdbcTemplate) {
if (configuration.getType() == MS_SQL) {
return new MsSqlRecordRepository(jdbcTemplate);
} else {
return new PostgreSqlRecordRepository(jdbcTemplate);
}
}
}
但是这似乎对我也不起作用,因为我在存储库类中使用的是Spring AOP。
Spring Boot是否还有其他机制,可让我在创建DatabaseConfiguration
bean之后选择正确的存储库实现?
谢谢