奇妙的注解(二)——Spring Data JPA @NoRepositoryBean接口

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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RemainderTime

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值