前言
这是跟着老师走一遍,做的记录
开发Dao接口,接口的实现对象肯定是通过动态代理来完成的(增强)
疑问:这个代理对象是怎么产生,过程怎样?
以往:如果要给⼀个对象产生代理对象,我们知道是在AbstractApplicationContext的refresh方法中,那么能不能在这个方法中找到什么我们当前场景的线索?
新的疑问又来了:
问题1: 为什么会给它指定为⼀个JpaRespositoryFactoryBean(getObject方法返回具体的对象)
问题2: 指定这个FactoryBean是在什么时候发生的
首先解决问题2:
传入⼀个resumeDao就返回了⼀个已经指定class为JpaRepositoryFactoryBean的BeanDefinition对象了,那么应该在上图中的get时候就有了,所以断点进入
问题来了,什么时候put到map中去的?这里定位到了⼀个方法在做这件事
可以发现,传入该方法的时候,BeanDefintion中的class就已经被指定为FactoryBean了,那么观察该方法的调用栈。
通过上述追踪可以发现,<jpa:repository basePackage,扫描到的接口,在进行BeanDefintion
注册时候,class会被固定的指定为JpaRepositoryFacotryBean
至此,问题2 追踪完毕
再来追踪问题1 JpaRespositoryFactoryBean是⼀个什么样的类,它是⼀个FactoryBean,这里重点关注FactoryBean的getObject方法
由此可见,JdkDynamicAopProxy会生成⼀个代理对象类型为SimpleJpaRespository,而该对象的增强逻辑就在JdkDynamicAopProxy类的invoke方法中。
至此,问题1追踪完毕。
疑问:这个代理对象类型SimpleJapRepository有什么特别的?
原来SimpleJpaRepository类实现了JpaRepository接口和JpaSpecificationExecutor接口