java - 为什么将 @Repository 放在 Spring Data JPA 接口之上?
问题描述
我经常看到如下代码:
@Repository
public interface CustomerRepository extends JpaRepository<Customer, Long>
我的问题是为什么我们需要这个@Repository
注释?
我理解为什么@Repository
存在,以及为什么我们可能需要在某些课程之上加入。
但是类没有从 Java 中的接口继承注解。当然,我可能会错过一些关于 Spring 'magic' 的内容,但默认的 JPA 实现类如下:
@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID>
它自己包含@Repository
,为什么我们需要在我们的界面上使用它?
Spring Data 文档在相关部分也没有说明任何内容@Repository
,但文档其他部分的一些偶尔示例包含@Repository
存在的代码片段,所以可能随着时间的推移发生了一些变化?
解决方案
我可能会错过一些关于 Spring 'magic' 的东西
很可能你会错过@EnableJpaRepositories
。来自文档:“默认情况下将扫描带注释的配置类的包以查找 Spring Data 存储库。 ”
为什么我们需要在我们的界面上使用它?
我们没有。@Repository
注释扩展/实现JpaRepository
或其他一些预定义接口扩展的接口/类是多余的Repository
,因为@EnableJpaRepositories
它们扩展/实现Repository
接口的事实。
来自存储库的相关引用(不是@Repository
):“一般目的是保存类型信息以及能够在类路径扫描期间发现扩展此接口的接口,以便轻松创建 Spring bean。”
现在为什么 thenSimpleJpaRepository
用 注释@Repository
?因为它与(再次是同一个文档)“带注释的配置类的包”位于不同的包中。
推荐阅读
- java - 503 服务在 Mule 中不可用
- docker - docker pull 时由未知权威签署的证书
- ios - 由于错误“ld:架构 x86_64 的 34 个重复符号”,IOS 应用程序无法启动
- r - R - 将具有不同参数的函数应用于随机行频率
- cloud - SCD 类型 - IICS (Informatica Cloud) 中的 2 实施
- hibernate - 具有嵌入式 ElementCollections 的 JPA CriteriaBuilder
- arrays - 从 HTTP GET 请求填充后,数组似乎评估为空
- flutter - 如何在颤振中获得经纬度
- vega-lite - 将字符串转换为日期 vega lite 的问题
- opencv - 如何将 OpenCV 4 与 ROS 一起使用?