Spring - выберите реализацию репозитория после создания bean-компонента - PullRequest
0 голосов
/ 18 июня 2020

Я разрабатываю приложение 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-компонента?

Спасибо

...