该注释用于避免为接口创建存储库代理,而这些接口实际上与回购界面的标准相匹配,但不打算成为一个。只有当您开始使用功能扩展所有存储库时才需要它。让我举一个例子:
假设你想为你的所有仓库添加一个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。
这种情况也是为什么CrudRepository
和PagingAndSortingRepository
也带有这个注释的原因。如果软件包扫描会偶然发现(因为您不小心以这种方式配置),引导程序将失败。
长话短说:使用注释来防止存储库接口被选为最终作为存储库bean实例的候选对象。
感谢这个详细解释奥利弗。 – balteo 2012-07-23 06:56:48
超级谢意。谢谢。 – ozgur 2017-06-14 09:30:01
很好地解释了答案。 – Mukti 2017-06-30 20:19:42