@RepositoryDefinition与继承Repository接口的差异是什么?
Spring Data JPA 仓库定义两种写法的差异
若不想继承Spring Data接口,也可使用
@RepositoryDefinition注解标记仓库接口。继承CRUD仓库接口会暴露操作实体的完整方法集;若希望选择性暴露方法,可将CRUD仓库中所需方法复制到领域仓库中。
但如果要选择性暴露方法,也可以直接继承Repository(这是一个标记接口)。换句话说,以下两种写法是否存在差异?
写法一:使用@RepositoryDefinition注解
@RepositoryDefinition(domainClass = Card.class, idClass = UUID.class) public interface BareBonesCardRepository { List<Card> findByAccountId(UUID accountId); }
写法二:继承Repository接口
public interface BareBonesCardRepository extends Repository<Card, UUID> { List<Card> findByAccountId(UUID accountId); }
结论
这两种写法没有本质功能差异,核心作用完全一致:
- 都会被Spring Data识别为仓库接口,自动生成代理实现类
- 都支持Spring Data的方法名解析、查询注解等核心特性
- 都仅暴露自定义的
findByAccountId方法,不会包含CRUD仓库的完整操作集
唯一的区别是写法形式:
- 继承
Repository是Spring Data仓库定义的标准范式,更常用 @RepositoryDefinition是为了规避接口继承场景(比如架构限制不允许继承特定接口)提供的替代方案
内容的提问来源于stack exchange,提问作者Sergey Zolotarev
相关产品推荐
相关产品推荐

