2012-07-20 200 views
23

在阅读Spring Data文档时,我多次遇到了@NoRepositoryBean接口。了解Spring数据JPA @NoRepositoryBean接口

要从文件引用:

如果您使用自动仓库接口检测使用 春天命名空间使用,就像是会造成弹簧 努力创造MyRepository实例的接口。这当然不是 所需的,因为它只是作为知识库和要为每个实体定义的实际存储库接口之间的中介。至 排除扩展知识库的界面被实例化为 存储库实例使用@NoRepositoryBean注释它。

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

回答

77

该注释用于避免为接口创建存储库代理,而这些接口实际上与回购界面的标准相匹配,但不打算成为一个。只有当您开始使用功能扩展所有存储库时才需要它。让我举一个例子:

假设你想为你的所有仓库添加一个foo()方法。您将开始添加像这样的回购界面

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

    void foo(); 
} 

您还将添加相应的实施类,工厂等。您的具体资料库界面现在将延长该中间接口:

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

} 

现在假设你引导 - 比方说春天数据JPA - 如下:

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

您使用com.foobar因为你在同一个包有CustomerRepository 。 Spring Data基础设施现在无法知道MyBaseRepository不是具体的存储库接口,而是作为中间回购来公开其他方法。所以它会尝试为它创建一个存储库代理实例并失败。您现在可以使用@NoRepositoryBean来注释该中间接口,以实质上告诉Spring Data:不要为此接口创建存储库代理bean。

这种情况也是为什么CrudRepositoryPagingAndSortingRepository也带有这个注释的原因。如果软件包扫描会偶然发现(因为您不小心以这种方式配置),引导程序将失败。

长话短说:使用注释来防止存储库接口被选为最终作为存储库bean实例的候选对象。

+3

感谢这个详细解释奥利弗。 – balteo 2012-07-23 06:56:48

+0

超级谢意。谢谢。 – ozgur 2017-06-14 09:30:01

+0

很好地解释了答案。 – Mukti 2017-06-30 20:19:42