在java配置中将spring数据存储库接口注册为bean

时间:2015-10-11 10:54:21

标签: spring-data spring-data-jpa spring-data-rest

我有一个spring数据存储库接口,我想在我的java配置中将其注册为@Bean。我之所以这样做是因为@Bean注释还允许我使用别名(如果我为bean提供了多个名称)。我不能做到这一点: @Bean(name = {"defaultMyRepo", "myRepo"}) public MyRepository defaultMyRepository() { return new MyRepository(); }

因为MyRepository是一个接口,我无法实例化它。

当我尝试在我的配置中创建一个bean时出现问题:

@Bean(name = { "defaultSearchProductExportWriter", "searchProductExportWriter" })
public RepositoryItemWriter<Serializable> defaultSearchProductExportWriter() {
    final RepositoryItemWriter<Serializable> itemWriter = new RepositoryItemWriter<>();
    itemWriter.setRepository(applicationContext.getBean(ProductSearchRepository.class));
    itemWriter.setMethodName("save");

    return itemWriter;
}

现在,这会打击multiple beans found, expected 1 but found 2。我还尝试将所需的bean作为参数传递给方法:

@Bean(name = { "defaultSearchProductExportWriter", "searchProductExportWriter" })
public RepositoryItemWriter<Serializable> defaultSearchProductExportWriter(final ProductSearchRepository repository) {
    final RepositoryItemWriter<Serializable> itemWriter = new RepositoryItemWriter<>();
    itemWriter.setRepository(repository);
    itemWriter.setMethodName("save");

    return itemWriter;
}

但是我得到了完全相同的例外。它只适用于我使用名称和别名定义存储库接口,然后使用不同名称和相同别名定义覆盖bean。这样我可以使用@Qualifier("myAlias"),它将找到正确的覆盖存储库接口。

这也可能是一个针对spring-data存储库的潜在功能请求,要求将value注释的@Repository属性更改为String[],以便我们也可以注册别名。< / p>

1 个答案:

答案 0 :(得分:0)

您可以将您的存储库自动装入Bean

@Bean(name = { "myRepository", "repo" })
public MyRepository myRepository(MyRepository myRepository) {

    return myRepository;
}

请不要只使用它。我不清楚为什么在任何时候都需要为存储库提供多个名称。阅读问题的评论,只有在您仍然认为需要多个名字的情况下才能使用它

可以在这里找到一个工作示例: https://github.com/Yannic92/stackOverflowExamples/tree/master/SpringBoot/TwoNamesForRepository