jpa代理Repository桂附地黄丸的作用与功效
原理
刚接触jpa的时候,我就被他惊艳了,⼼想 还写什么sql啊!!”、“还⽤什么mybatis啊”、”还建什么表啊!
我们写Repository 普遍继承⼀个JpaRepository接⼝,⽽⽤的时候直接注⼊就⾏了,这么⽞学的吗?
原来JpaRepository接⼝只是它的外壳,其真正实现类是simplejpaReository ,
{$Proxy} 说明启动了代理
有注⼊ioc容器,我们来断⼀下ConfigurationClassBeanDefinitionReader.loadBeanDefinitions() ⽅法
扫描所以需要配置的类了
但是 没有发现我们⾃⼰Repository, 因为spring qq被冻结了怎么样才可以解冻
扫描有⼀定规则,⽐如扫描 @Compo,@Controller,等注解的
说明他是通过Jpa某个类 来处理的,这⾥我停滞了⼀段时间来搜索相关的信息,
发现ImportBeanDefinitionRegistrar接⼝ 可以动态注⼊Bean
发现
RepositoryConfigurationSourceSupport implements BeanFactoryAware, ImportBeanDefinitionRegistrar, ResourceLoaderAware, EnvironmentAware
JpaRepositoriesAutoConfigureRegistrar extends RepositoryConfigurat创新的意义
ionSourceSupport
加断点 看看
发现了新⼤陆
RepositoryBeanDefinitionBuilder builder =new RepositoryBeanDefinitionBuilder(registry, extensio大班随笔
n, resourceLoader,environment);动态注册器
扫描Repository
具体扫描
新建扫描器,并加⼊过滤器 扫描所继承Repository接⼝ 并不是Jparepository哦 有的Repository @NoRepositoryBean注解 并不注⼊返回到上⾯
扫描完成后,以我们的类名为Beanname,BeanDefinition为JpaRepositoryFactoryBean
JpaRepositoryFactoryBean关系图
发现实现了InitializingBean接⼝,忍住激动继续⾛
Spring 中AbstractAutowireCapableBeanFactory类中的invokeInitMethods 调⽤我们的afterPropertiesSet() 来初始化Bean
判断是否实现了InitializingBean
设置代理
Object target = getTargetreal崔雪莉
Repository(information); 通过获取SimpleJpaRepository 我们可以重写这个⽅法 来获得⾃定义的类
result.addAdvice 来实现我们⾃定义的⽅法的
总结:
spring boot @EnableAutoConfiguration 扫描 spring.factories⽂件 JpaRepositoriesAutoConfiguration 这Jpa的配置类
IOC容器再过 ImportBeanDefinitionRegistrars() 获取JpaRepositoriesAutoConfigureRegistrar 再注册我们⾃⼰⾃定义的Repository
以我们的类名为Beanname,BeanDefinition为JpaRepositoryFactoryBean
然后 对Bean进⼀步处理 after梦见很多蛆
PropertiesSet() 设置代理 处理⾃定义⽅法
篇幅原因,就分析到这了吧
未经本⼈同意 不能转载