一. resumeDao代理对象是怎么产生的,过程怎样?
以往:如果要给⼀个对象产⽣代理对象,我们知道是在
AbstractApplicationContext
的
refresh
⽅法中,那么能不能在这个⽅法中找到什么我们当前场景的线索?
新的疑问⼜来了?
问题
1
: 为什么会给它指定为⼀个
JpaRespositoryFactoryBean
(
getObject
⽅法返回具体的对象)
问题
2
:指定这个
FactoryBean
是在什么时候发⽣的?
⾸先解决问题
2
:
传⼊⼀个
resumeDao
就返回了⼀个已经指定
class
为
JpaRepositoryFactoryBean
的
BeanDefifinition
对象了,那么应该在上图中的
get
时候就有了,所以断点进⼊
问题来了,什么时候put到map中去的?我们定位到了⼀个⽅法在做这件事
我们发现,传⼊该⽅法的时候,
BeanDefifintion
中的
class
就已经被指定为
FactoryBean
了,那么观察该⽅法的调⽤栈
通过上述追踪我们发现,
<jpa:repository basePackage
,扫描到的接⼝,在进⾏
BeanDefifintion
注册时候,
class
会被固定的指定为
JpaRepositoryFacotryBean⾄此,问题
2
追踪完毕
那么接下来,我们再来追踪问题
1 JpaRespositoryFactoryBean
是⼀个什么样的类
它是⼀个
FactoryBean
,我们重点关注
FactoryBean
的
getObject
⽅法
由此可⻅,
JdkDynamicAopProxy
会⽣成⼀个代理对象类型为
SimpleJpaRespository
,⽽该对象的增强逻辑就在
JdkDynamicAopProxy
类的
invoke
⽅法中
⾄此,问题
1
追踪完毕。
二.这个代理对象类型SimpleJapRepository有什么特别的?
原来SimpleJpaRepository类实现了JpaRepository接⼝和JpaSpecifificationExecutor接⼝