Sneakydog-demo / sneakydog-demo.github.io

Sneakydog-demo
http://myhxh.xyz
0 stars 0 forks source link

springboot动态注册bean #11

Open fuzhoudong opened 2 years ago

fuzhoudong commented 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 {
    }

}