Spring Data JPA @NoRepositoryBean接口
如果您正在使用Spring命名空间使用Spring命名空间进行自动存储库接口检测,那将导致Spring尝试创建MyRepository实例。这当然不是所希望的,因为它只是在Repository和您要为每个实体定义的实际存储库接口之间起中间作用。要将扩展存储库的接口排除在实例化为存储库实例之外,请使用@NoRepositoryBean
。
自己通俗的讲连接:
相当于你在使用spring data jpa 的时候,每个实体类有需要实现的相同的方法,就可以单独抽取出来,放在一个公共的接口MyRepository中,并这个类继承了jpa的相关Repository接口或类,由MyRepository接口来衔接jpa的相关操作,其他实体类需要实现的操作就直接继承MyRepository接口,不用每次都去继承jpa的相关接口或类啦,所以这个公共接口就需要这个注解
@NoRepositoryBean
来标识
另一解释:
注释用于避免为实际匹配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实例。