当前位置 博文首页 > RemainderTime:奇妙的注解(二)——Spring Data JPA @NoReposi

    RemainderTime:奇妙的注解(二)——Spring Data JPA @NoReposi

    作者:[db:作者] 时间:2021-07-12 21:43

    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实例。

    cs