题 了解Spring Data JPA @NoRepositoryBean接口


我遇到了 @NoRepositoryBean 在阅读Spring Data文档时多次连接。

引用文档:

如果您正在使用自动存储库接口检测   使用接口的Spring命名空间将导致Spring   试图创建一个MyRepository实例。这当然不是   因为它只是在Repository和the之间起作用   您要为每个实体定义的实际存储库接口。至   排除扩展Repository的实例化的接口   存储库实例用它注释它 @NoRepositoryBean

但是,我仍然不确定何时何地使用它。有人可以建议并给我一个具体的用法示例吗?


34
2017-07-20 09:42


起源




答案:


注释用于避免为实际匹配repo接口条件但不打算成为一个接口的接口创建存储库代理。只有在您开始使用功能扩展所有存储库时才需要它。让我举一个例子:

假设您要向所有存储库添加方法foo()。您将首先添加这样的repo界面

public interface com.foobar.MyBaseInterface<…,…> extends CrudRepository<…,…> {

  void foo();
}

您还可以添加相应的实现类,工厂等。您具体的存储库接口现在将扩展该中间接口:

public interface com.foobar.CustomerRepository extends MyBaseInterface<Customer, Long> {

}

现在假设你引导 - 让我们说Spring Data JPA - 如下:

<jpa:repositories base-package="com.foobar" />

你用 com.foobar 因为你有 CustomerRepository 在同一个包中。 Spring Data基础架构现在无法告诉它 MyBaseRepository 不是具体的存储库接口,而是充当中间存储库来公开其他方法。因此它会尝试为它创建一个存储库代理实例并失败。你现在可以使用了 @NoRepositoryBean 注释这个中间接口基本上告诉Spring Data:不要为这个接口创建一个存储库代理bean。

这种情况也是原因所在 CrudRepository 和 PagingAndSortingRepository 也带有这个注释。如果软件包扫描意外地选择了这些(因为你不小心这样配置了),引导程序就会失败。

简而言之:使用注释来防止存储库接口被选为最终作为存储库bean实例的候选者。


89
2017-07-20 19:29



谢谢你详细解释奥利弗。 - balteo
超级回答。谢谢。 - ozgur
很好地解释了答案。 - Mukti
很棒的解释 - sarmahdi
:o你是......注释本身的作者...... - sarmahdi