spring 接口和实现类放哪个包_Spring只定义接口自动代理接口实现类

37272ad1f69371d71dbedd67c8b884a6.png

能够扫描到包

@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 !
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值