注释用于避免为实际匹配 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 实例。