很好奇,我在项目中只定义了一个,继承了CrudRepository接口或者JpaRepository接口,的接口,他的实体类,是在什么时候生成并且注册到Spring的IOC容器的呢?
public interface TestRepository extends JpaRepository<TestEntity, String> {
}
上面这个接口,为什么我在代码中,直接通过@Autowire,就可以从IOC容器中获得这个接口的实体类,来进行CURD操作的呢?
请各位大佬不吝赐教。。
很好奇,我在项目中只定义了一个,继承了CrudRepository接口或者JpaRepository接口,的接口,他的实体类,是在什么时候生成并且注册到Spring的IOC容器的呢?
public interface TestRepository extends JpaRepository<TestEntity, String> {
}
上面这个接口,为什么我在代码中,直接通过@Autowire,就可以从IOC容器中获得这个接口的实体类,来进行CURD操作的呢?
请各位大佬不吝赐教。。
你指的实体类应该时这个接口的实现的实例。
什么时候生成并且注入到Spring容器中? 根据实例化的策略, 可以时项目启动时, 也可以是这个方法被调用时。
我想你真正想问的应该时这个接口的实例是如何生成的吧, 大概逻辑是这样子的: 根据指定的entity:TestEntity的信息生成相应动态代理
4 回答968 阅读
4 回答869 阅读
1 回答962 阅读✓ 已解决
584 阅读
1 回答1.4k 阅读✓ 已解决
486 阅读
接口
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就是动态创建的类方法返回的结果。