(1). 概述
前面有对Spring Data Elasticsearch有了一个比较简单的入门,是否好奇,为什么写一个接口(BookRepository),实现ElasticsearchRepository,即可,拥有基本的增删改查操作,Spring Data Elasticsearch底层到底做了什么?   
底层原理就在:ElasticsearchRepositoriesRegistrar里.
(2). ElasticsearchRepositoriesAutoConfiguration
package org.springframework.boot.autoconfigure.data.elasticsearch;
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ Client.class, ElasticsearchRepository.class })
@ConditionalOnProperty(prefix = "spring.data.elasticsearch.repositories", name = "enabled", havingValue = "true",
		matchIfMissing = true)
@ConditionalOnMissingBean(ElasticsearchRepositoryFactoryBean.class)
// ******************************************************************************************
// 1. @import相当于导入一个配置类
// ******************************************************************************************
@Import(ElasticsearchRepositoriesRegistrar.class)
public class ElasticsearchRepositoriesAutoConfiguration {
}
(3). AbstractRepositoryConfigurationSourceSupport
package org.springframework.boot.autoconfigure.data;
public abstract class AbstractRepositoryConfigurationSourceSupport 
    // ********************************************************************
	// 1. 实现了Spring的方法:ImportBeanDefinitionRegistrar
	// ********************************************************************
    implements ImportBeanDefinitionRegistrar, BeanFactoryAware, ResourceLoaderAware, EnvironmentAware {
	private ResourceLoader resourceLoader;	
	private BeanFactory beanFactory;
	private Environment environment;
    // ********************************************************************
	// 2. Spring会回调访方法
	// ********************************************************************
	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		// 委托给了另一个方法.
		registerBeanDefinitions(importingClassMetadata, registry, null);
	} // end registerBeanDefinitions
    // ********************************************************************
	// 3. 注册Bean定义信息
	// ********************************************************************
	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {
		RepositoryConfigurationDelegate delegate = new RepositoryConfigurationDelegate(
		// *************************************************************************
		// 4. 获得配置类(ElasticsearchRepositoriesRegistrar$EnableElasticsearchRepositoriesConfiguration)
		// *************************************************************************
		getConfigurationSource(registry, importBeanNameGenerator), this.resourceLoader, this.environment);
		
		// *************************************************************************
		// 5. 委托给:RepositoryConfigurationDelegate进行Bean的注册
		// getRepositoryConfigurationExtension() == ElasticsearchRepositoryConfigExtension
		// *************************************************************************
		delegate.registerRepositoriesIn(registry, getRepositoryConfigurationExtension());
	} // end registerBeanDefinitions
	
	// *************************************************************************
	// 4.1 获得(ElasticsearchRepositoriesRegistrar$EnableElasticsearchRepositoriesConfiguration)类上的注解(@@EnableElasticsearchRepositories)
	// *************************************************************************
	private AnnotationRepositoryConfigurationSource getConfigurationSource(BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {
		AnnotationMetadata metadata = AnnotationMetadata.introspect(getConfiguration());
		return new AutoConfiguredAnnotationRepositoryConfigurationSource(metadata, getAnnotation(), this.resourceLoader, this.environment, registry, importBeanNameGenerator) {
		};
	} // end getConfigurationSource
	
}
(4). ElasticsearchRepositoriesRegistrar
package org.springframework.boot.autoconfigure.data.elasticsearch;
class ElasticsearchRepositoriesRegistrar extends AbstractRepositoryConfigurationSourceSupport {
	
	// 定义注解
	@Override
	protected Class<? extends Annotation> getAnnotation() {
		return EnableElasticsearchRepositories.class;
	}
	// 配置类
	@Override
	protected Class<?> getConfiguration() {
		return EnableElasticsearchRepositoriesConfiguration.class;
	}
	// 2. 定义配置扩展
	@Override
	protected RepositoryConfigurationExtension getRepositoryConfigurationExtension() {
		return new ElasticsearchRepositoryConfigExtension();
	}
	// 1. 定义注解
	@EnableElasticsearchRepositories
	private static class EnableElasticsearchRepositoriesConfiguration {
	}
}
(5). 总结
Spring Data Elasticsearch在启动时,加载类ElasticsearchRepositoriesRegistrar$EnableElasticsearchRepositoriesConfiguration以及注解:@EnableElasticsearchRepositories,最终会委托给:RepositoryConfigurationDelegate进行Bean的注册.