spring data jpa查询的实体类是在什么地方实现的?
很好奇,我在项目中只定义了一个,继承了CrudRepository接口或者JpaRepository接口,的接口,他的实体类,是在什么时候生成并且注册到Spring的IOC容器的呢?
public interface TestRepository extends JpaRepository<TestEntity, String> {
}
上面这个接口,为什么我在代码中,直接通过@Autowire,就可以从IOC容器中获得这个接口的实体类,来进行CURD操作的呢?
请各位大佬不吝赐教。。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
你指的实体类应该时这个接口的实现的实例。
什么时候生成并且注入到Spring容器中? 根据实例化的策略, 可以时项目启动时, 也可以是这个方法被调用时。
我想你真正想问的应该时这个接口的实例是如何生成的吧, 大概逻辑是这样子的: 根据指定的entity:TestEntity的信息生成相应动态代理
接口
TestRepository
的实现类是org.springframework.aop.framework.ProxyFactory
动态生成的,编译的代码里并没有实现类, 而是真正调用接口时通过 AOP 切面的方式动态在内存里生成的。如果你在接口调用处设调试断点,你会跟踪到 JdkDynamicAopProxy 类的调用方法里:
这个方法的参数
method
就是你的接口方法,这个方法里会通过this.advised.getInterceptorsAndDynamicInterceptionAdvice(...)
得到切面拦截链,进一步创建invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain)
对象,用来模拟类的方法实现,retVal = invocation.proceed();
,根据拦截器的多少,嵌套调用,每层拦截器可以简章理解为是对不同注解的处理,总的来看,相当于方法调用,retVal
就是动态创建的类方法返回的结果。