jpa 代理Repository原理

刚接触jpa的时候,我就被他惊艳了,心想 还写什么sql啊!!”、“还用什么mybatis啊”、”还建什么表啊!

我们写Repository 普遍继承一个JpaRepository接口,而用的时候直接注入就行了,这么玄学的吗?


原来JpaRepository接口只是它的外壳,其真正实现类是simplejpaReository ,

{$Proxy} 说明启动了代理

有注入ioc容器,我们来断一下ConfigurationClassBeanDefinitionReader.loadBeanDefinitions() 方法


扫描所以需要配置的类了

但是 没有发现我们自己Repository, 因为spring 扫描有一定规则,比如扫描 @Compose,@Controller,等注解的

说明他是通过Jpa某个类 来处理的,这里我停滞了一段时间来搜索相关的信息,

发现ImportBeanDefinitionRegistrar接口 可以动态注入Bean

发现

RepositoryConfigurationSourceSupport implements BeanFactoryAware, ImportBeanDefinitionRegistrar, ResourceLoaderAware, EnvironmentAware

JpaRepositoriesAutoConfigureRegistrar extends RepositoryConfigurationSourceSupport

加断点 看看


发现了新大陆

extension.registerBeansForRoot(registry, configurationSource);上下文配置

RepositoryBeanDefinitionBuilder builder =new RepositoryBeanDefinitionBuilder(registry, extension, resourceLoader,environment);动态注册器


扫描Repository


具体扫描

新建扫描器,并加入过滤器 扫描所继承Repository接口 并不是Jparepository哦  有的Repository @NoRepositoryBean注解 并不注入

返回到上面

扫描完成后,以我们的类名为Beanname,BeanDefinition为JpaRepositoryFactoryBean


JpaRepositoryFactoryBean关系图

发现实现了InitializingBean接口,忍住激动继续走

Spring 中AbstractAutowireCapableBeanFactory类中的invokeInitMethods 调用我们的afterPropertiesSet() 来初始化Bean


判断是否实现了InitializingBean


设置代理

Object target = getTargetRepository(information); 通过获取SimpleJpaRepository  我们可以重写这个方法 来获得自定义的类

result.addAdvice 来实现我们自定义的方法的


总结:

spring boot @EnableAutoConfiguration 扫描 spring.factories文件 JpaRepositoriesAutoConfiguration 这Jpa的配置类


IOC容器再过 configClass.getImportBeanDefinitionRegistrars() 获取JpaRepositoriesAutoConfigureRegistrar  再注册我们自己自定义的Repository

以我们的类名为Beanname,BeanDefinition为JpaRepositoryFactoryBean

然后 对Bean进一步处理 afterPropertiesSet()  设置代理 处理自定义方法

篇幅原因,就分析到这了吧

未经本人同意 不能转载

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.1 spring IoC容器和beans的简介 Spring 框架的最核心基础的功能是IoC(控制反转)容器,...
    simoscode阅读 6,877评论 2 22
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,315评论 6 342
  • https://www.ibm.com/developerworks/cn/opensource/os-cn-sp...
    大同若鱼阅读 5,174评论 4 18
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,949评论 19 139
  • 冥冥之中,生活总会让你有或多或少的惊喜或惊吓。一件事情,想到了就去做,必然是最好结局,纵然结果并不一定是预想的如此...
    下辈子做猪阅读 261评论 0 0

友情链接更多精彩内容