JpaRepository注册为Bean
SpringBoot 中配置数据源,创建一个继承了 JpaRepository 的接口,并将实体类型和 ID 类型传入即可。
public interface ExapmleRepository extends JpaRepository<Example, Long> {
}
这个自动配置主要通过 JpaRepositoriesRegister 类来实现,该类继承了 RepositoryBeanDefinitionRegistrarSupport 类,并且有 RepositoryBeanDefinitionRegistrarSupport() 和 getExtension() 两个方法,其中 RepositoryBeanDefinitionRegistrarSupport() 用于激活 @EnableJpaRepositories,getExtension() 用于返回 JpaRepositoryConfigExtension。
class JpaRepositoriesRegistrar extends RepositoryBeanDefinitionRegistrarSupport {
JpaRepositoriesRegistrar() {
}
protected Class<? extends Annotation> getAnnotation() {
return EnableJpaRepositories.class;
}
protected RepositoryConfigurationExtension getExtension() {
return new JpaRepositoryConfigExtension();
}
}
父类 RepositoryBeanDefinitionRegistrarSupport 的核心方法是 registerBeanDefinitions,这个方法负责获取配置源的信息、扩展信息(在这里是针对JPA的信息)和调用 delegate 的注册 Repositories 的方法。
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry, BeanNameGenerator generator) {
Assert.notNull(metadata, "AnnotationMetadata must not be null!");
Assert.notNull(registry, "BeanDefinitionRegistry must not be null!");
Assert.notNull(this.resourceLoader, "ResourceLoader must not be null!");
if