spring data jpa查询的实体类是在什么地方实现的?

发布于 2022-09-11 18:10:55 字数 299 浏览 11 评论 0

很好奇,我在项目中只定义了一个,继承了CrudRepository接口或者JpaRepository接口,的接口,他的实体类,是在什么时候生成并且注册到Spring的IOC容器的呢?

public interface TestRepository extends JpaRepository<TestEntity, String> {

}

上面这个接口,为什么我在代码中,直接通过@Autowire,就可以从IOC容器中获得这个接口的实体类,来进行CURD操作的呢?

请各位大佬不吝赐教。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

倚栏听风 2022-09-18 18:10:55

你指的实体类应该时这个接口的实现的实例。
什么时候生成并且注入到Spring容器中? 根据实例化的策略, 可以时项目启动时, 也可以是这个方法被调用时。

我想你真正想问的应该时这个接口的实例是如何生成的吧, 大概逻辑是这样子的: 根据指定的entity:TestEntity的信息生成相应动态代理

七堇年 2022-09-18 18:10:55

接口TestRepository的实现类是 org.springframework.aop.framework.ProxyFactory 动态生成的,编译的代码里并没有实现类, 而是真正调用接口时通过 AOP 切面的方式动态在内存里生成的。

如果你在接口调用处设调试断点,你会跟踪到 JdkDynamicAopProxy 类的调用方法里:

public Object invoke(Object proxy, Method method, Object[] args) t

这个方法的参数method就是你的接口方法,这个方法里会通过this.advised.getInterceptorsAndDynamicInterceptionAdvice(...) 得到切面拦截链,进一步创建 invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain) 对象,用来模拟类的方法实现, retVal = invocation.proceed();,根据拦截器的多少,嵌套调用,每层拦截器可以简章理解为是对不同注解的处理,总的来看,相当于方法调用, retVal 就是动态创建的类方法返回的结果。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文