Я разрабатываю приложение Spring Boot, которое сохраняет данные в базе данных MS SQL. Мне поручено добавить поддержку 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
и bean-компонентов репозитория, поскольку @Conditional
оценивается при синтаксическом анализе. @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);
}
}
}
Но похоже, что и у меня он не работает, sice I ' m, используя Spring AOP для моих классов репозитория.
Есть ли у Spring Boot какой-то другой механизм, который позволяет мне выбрать правильную реализацию репозитория после создания моего DatabaseConfiguration
bean-компонента?
Спасибо