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

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

public interface TestRepository extends JpaRepository<TestEntity, String> {

}

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

请各位大佬不吝赐教。。

阅读 3.2k
2 个回答

接口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 就是动态创建的类方法返回的结果。

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题