Open fuzhoudong opened 2 years ago
(1)ImportBeanDefinitionRegistrar
class UnifiedpayImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry, false); scanner.addIncludeFilter(new TypeFilter() { @Override public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { return metadataReader.getAnnotationMetadata().isAnnotated(BiandanUnifiedpay.class.getName()); } }); Set<BeanDefinition> candidateComponents = scanner.findCandidateComponents("unifiedpay.service"); if (registry.containsBeanDefinition("wxPayService")) { for (BeanDefinition candidateComponent : candidateComponents) { candidateComponent.setDependsOn("wxPayService"); String beanClassName = candidateComponent.getBeanClassName(); try { if (beanClassName != null) { Class<?> aClass = Class.forName(beanClassName); BiandanUnifiedpay annotation = aClass.getAnnotation(BiandanUnifiedpay.class); String beanName = annotation.name(); registry.registerBeanDefinition(beanName, candidateComponent); } } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } } }
(2)或者BeanDefinitionRegistryPostProcessor
class RegisterMissingBeanPostProcessor implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry, false); scanner.addIncludeFilter(new TypeFilter() { @Override public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { return metadataReader.getAnnotationMetadata().isAnnotated(BiandanUnifiedpay.class.getName()); } }); Set<BeanDefinition> candidateComponents = scanner.findCandidateComponents("unifiedpay.service"); if (!candidateComponents.isEmpty()) { for (BeanDefinition candidateComponent : candidateComponents) { String beanClassName = candidateComponent.getBeanClassName(); Class<?> aClass = null; try { aClass = Class.forName(beanClassName); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } BiandanUnifiedpay annotation = aClass.getAnnotation(BiandanUnifiedpay.class); String[] dependsOn = annotation.dependsOn(); if (dependsOn.length > 0) { boolean test = Arrays.stream(dependsOn).anyMatch(x -> !x.isEmpty() && !registry.containsBeanDefinition(x)); if (test) { continue; } } registry.registerBeanDefinition(annotation.name(), candidateComponent); } } } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { } }
(1)ImportBeanDefinitionRegistrar
(2)或者BeanDefinitionRegistryPostProcessor