![37272ad1f69371d71dbedd67c8b884a6.png](https://i-blog.csdnimg.cn/blog_migrate/8967a22363ed06f6f38e77ff38dc4de3.jpeg)
能够扫描到包
@ComponentScan("org.zxp.esclientrhl")
ESCRegistrar类主要实现ImportBeanDefinitionRegistrar接口
@Configurationpublic class ESCRegistrar extends AbstractESCRegister implements BeanFactoryAware,ApplicationContextAware, ImportBeanDefinitionRegistrar, ResourceLoaderAware, EnvironmentAware {
实现下面方法,会在spring启动早期调用生成代理bean
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) { //扫描entity new ESIndexProcessor().scan(annotationMetadata,beanFactory,applicationContext); //扫描接口 super.registerBeanDefinitions(beanFactory, environment, resourceLoader, annotationMetadata, registry); }
扫描entity,通过注解配置或者启动目录扫描实体类并托管给Spring管理(和自动代理接口实现类无关,用于自动创建索引)
public void scan(AnnotationMetadata annotationMetadata,BeanFactory beanFactory,ApplicationContext applicationContext){ GetBasePackage getBasePackage = new GetBasePackage(EnableESTools.class); ESEntityScanner scanner = new ESEntityScanner((BeanDefinitionRegistry) beanFactory); scanner.setResourceLoader(applicationContext); scanner.scan(getBasePackage.getEntityPackage(annotationMetadata).toArray(String[]::new));}
通过getCandidates方法获取继承ESCRepository的接口
public Stream getCandidates(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry, Environment environment, ResourceLoader resourceLoader) { ESCRepositoryComponentProvider scanner = new ESCRepositoryComponentProvider(registry); scanner.setEnvironment(environment); scanner.setResourceLoader(resourceLoader); //输入是basepackages,输出是BeanDefinition的Stream return getBasePackage(annotationMetadata).flatMap(it -> scanner.findCandidateComponents(it).stream());}
下面这两种scan不同,第一个就是扫描后能被spring识别,第二个是扫描到后返回BeanDefinition
scanner.findCandidateComponents(it)scanner.scan(getBasePackage.getEntityPackage(annotationMetadata).toArray(String[]::new));
获取继承ESCRepository的接口(BeanDefinition)并遍历
通过BeanDefinitionBuilder给RepositoryFactorySupport传递扫描到接口的类类型、以及要生成代理bean的name
调用beanDefinitionRegistry.registerBeanDefinition(beanName, bd);将RepositoryFactorySupport托管给spring(注意RepositoryFactorySupport并不是目的,是通过RepositoryFactorySupport生成代理bean)
RepositoryFactorySupport的作用就是注册bean
public void registerBeanDefinitions(BeanFactory factory, Environment environment, ResourceLoader resourceLoader, AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) { getCandidates(annotationMetadata, registry, environment, resourceLoader).forEach(beanDefinition -> { BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(RepositoryFactorySupport.class); String beanClassName = beanDefinition.getBeanClassName(); //传入要实例化的接口 beanDefinitionBuilder.addConstructorArgValue(beanClassName); //获取bean的定义 BeanDefinition bd = beanDefinitionBuilder.getRawBeanDefinition(); //生成beanname String beanName = beanClassName.substring(beanClassName.lastIndexOf(".") + 1); if(org.zxp.esclientrhl.auto.util.EnableESTools.isPrintregmsg()){ logger.info("generate ESCRegistrar beanClassName:" + beanClassName); logger.info("generate ESCRegistrar beanName:" + beanName); } BeanDefinitionRegistry beanDefinitionRegistry = (BeanDefinitionRegistry) factory; //注册bean beanName是代理bean的名字 不是RepositoryFactorySupport的名字 beanDefinitionRegistry.registerBeanDefinition(beanName, bd); }); }
repositoryInterface用于接收传入的接口类类型(准备通过动态代理生成)
通过afterPropertiesSet在RepositoryFactorySupport注册完成后生成并注册真正的代理bean
public class RepositoryFactorySupport, S, ID> implements ApplicationContextAware, ResourceLoaderAware, InitializingBean, FactoryBean, BeanClassLoaderAware, BeanFactoryAware, ApplicationEventPublisherAware { …… private final Class extends T> repositoryInterface; public RepositoryFactorySupport(Class extends T> repositoryInterface) { this.repositoryInterface = repositoryInterface; } @Override public void afterPropertiesSet() { try { this.repository = this.getRepository(repositoryInterface); } catch (Exception e) { logger.error("ESCRepository proxy create fail !