重写Spring Repository方法未实现,底层调用哪个实现类?
你的Spring Repository重写方法为啥没实现也能跑?答案在这!
这问题戳中了Spring Data JPA最核心的动态代理机制,我给你掰扯明白:
首先,你调试到的AOP类其实是Spring生成的动态代理对象,它的作用就是把你的方法调用转发给真正的实现类——没错,就是JpaRepository的默认实现SimpleJpaRepository!
具体来龙去脉是这样的:
- 当你定义的Repository接口继承了
JpaRepository,Spring Data JPA的RepositoryFactorySupport会自动为这个接口创建代理实例。 - 哪怕你重写了接口方法但没写实现,只要你的方法名符合Spring Data的查询方法命名规范(比如
findByUsername、deleteById这类),Spring会自动解析方法名,生成对应的JPQL/SQL语句,然后调用SimpleJpaRepository里的底层逻辑去执行数据库操作。 - 你看到的AOP类就是这个代理,它负责拦截你的方法调用,把请求传递给
SimpleJpaRepository的对应方法(或者根据方法名生成的动态查询逻辑)。
怎么验证?
你可以在调试时查看代理对象的target属性,会发现它指向的就是SimpleJpaRepository的实例——这就是真正干活的家伙。
补充个小细节:
如果你的重写方法不符合命名规范,Spring就会报错,要求你要么写实现,要么用@Query注解手动指定查询语句。既然你的方法能正常运行,说明方法名完全符合Spring Data的规则,它帮你自动生成了实现逻辑。
内容的提问来源于stack exchange,提问作者Toumi
相关产品推荐
相关产品推荐

