春季-创建bean后选择存储库实现

时间:2020-06-18 11:13:10

标签: spring configuration conditional-statements repository javabeans

我正在开发将数据持久保存到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之后选择正确的存储库实现?

谢谢

0 个答案:

没有答案
相关问题