Repository原理
核心机制: 动态代理 :
- JdkDynamicAopProxy#invoke
调用JPA的Repository统一实现
SimpleJpaRepository
就是去通过JPA的API完成的持久化操作
Spring整合jpa原理
- Spring怎么管理Repository( 怎么创建的Repository的Bean)
1.@EnableJpaRepositories(basePackages=“com.tuling.repositories”) - Spring容器启动的时候ioc 容器加载 根据 “com.tuling.repositories” 去创建Bean
1. 没有找到Bean 解决思路:
应用层面:是不是配置不正确 ,配置正确 , 排除
底层层面:是不是spring底层扫描 排除。 (Bean —>对象) - 同自定义扫描器, 让它将接口包含在内 , (必须实现Repository)
1.1 重写isCandidateComponent
- 实现BeanDefinitionRegistryPostProcessor ,动态注册BeanDefinition
1.1 调用自定义扫描器的scan 进行扫描
2. Spring怎么将动态代理创建bean
怎么将repository的BeanDefinition和动态代理结合:
1.有什么方式可以随意去控制bean实例化过程。
@Component
@Bean
FacotryBean动态设置Repository的接口类型, getObject() 自由控制实例化过程 —> 创建动态代理
总结:
Spring Data Jpa源码过程: - @EnableJpaRepositories(basePackages=“com.tu.repositories”)
- @Import(JpaRepositoriesRegistrar.class)
- JpaRepositoriesRegistrar实现了ImportBeanDefinitionRegistrar , 就拥有了动态注册
BeanDefinition的能力 = BeanDefinitionRegistryPostProcessor的功能 - 自定义扫描器RepositoryComponentProvider,重写排除接口的方法
isCandidateComponent - 根据扫描成功候选BeanDefinition重写创建beanDefintion
- 设置新的beanDefintion为JpaRepositoryFactoryBean
- JpaRepositoryFactoryBean是一个BeanFactory
- JpaRepositoryFactoryBean 会创建动态代理