当前位置: 首页 > 面试题库 >

了解Spring Data JPA @NoRepositoryBean接口

公冶和豫
2023-03-14
问题内容

@NoRepositoryBean在阅读Spring Data文档时,我多次遇到该界面。

引用文档:

如果您按原样使用通过接口使用Spring命名空间的自动存储库接口检测,将导致Spring尝试创建MyRepository实例。当然这是不希望的,因为它仅充当存储库和您要为每个实体定义的实际存储库接口之间的中介。要排除扩展存储库的接口被实例化为存储库实例,请使用注释@NoRepositoryBean

但是,我仍然不确定何时何地使用它。有人可以建议并给我一个具体的用法示例吗?


问题答案:

注释用于避免为实际上与存储库接口的条件匹配但不希望成为接口的接口创建存储库代理。仅在开始扩展具有功能的所有存储库时才需要它。让我举一个例子:

假设您想向所有存储库添加方法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。

这情景也是为什么原因CrudRepositoryPagingAndSortingRepository携带这种标注为好。如果程序包扫描偶然发现了那些(因为您是用这种方式意外配置的),则引导程序将失败。

长话短说:使用注释可防止将存储库接口用作候选对象,最终最终成为存储库bean实例。



 类似资料:
  • 我对一些基本的Spring数据概念有点困惑。 据我所知,典型的DAO级别结构如下所示: 有了这个概念,我可以使用JPA作为第一个DAO接口的实现,使用JDBC作为第二个DAO接口的实现。 现在我想了解Spring存储库抽象。每个Spring Data tutorial都指定,我应该有一个接口,例如,该接口应该从JPararePository扩展。所以有了这个接口,我已经用JPA锁定了,对吧? 如果

  • 我只想不使用xml,所以我需要非xml替代这些设置。这是我的POM。

  • 问题内容: 我想我需要更好地了解连接池的概念。我正在使用Java与ConnectorJ一起工作,并将servlet部署在Apache Tomcat服务器上。我一直在关注该文档,因此我的Tomcat context.xml如下所示: 我使用推荐的方式从数据源获得连接: 我的问题是:为什么我必须在context.xml中为我的数据源指定用户和密码。如果我错了,请纠正我,但我认为连接池的重点是重用拥有相

  • 问题内容: 我正在努力了解基本的MySQL连接。 基本上,我有2个表,其中一个包含客户的名字和地址ID,另一个具有实际地址。 我不仅要显示客户名称和地址ID,还希望它显示客户名称和实际地址。 我的基本选择语句是这样的: 它将显示如下内容: 而不是我想将addressId与另一个表中的实际地址连接起来 像这样: 有谁可以向我展示实现这一目标的最佳方法? 也有人可以推荐一个很好的联接教程吗? 问题答案

  • 我有一个broker.xml文件,它有以下代码 接受者说,嘿,你可以在端口61617上与我连接,我正在听它(这对我来说是有意义的),但是连接器在这个broker.xml中的角色是什么。Connector的目标端口与acceptor相同(TCP://0.0.0.0:61616),我想了解一下Connector中提到的端口是什么意思,能不能解释一下。

  • 我正在尝试对一些套接字进行编程,因此,在服务器端,我使用。就我所理解的程度而言,在我看来,这个函数会生成一个随机的IP(我是对的吗?实际上,我想将我的套接字与我的绑定。但是如果我运行这个 我得到0作为返回值。有人能解释一下吗?