ConfigurationClassPostProcessor-1.processConfigBeanDefinitions

ConfigurationClassPostProcessor-1.processConfigBeanDefinitions

这是一个非常重要的类,他负责解析了所有的自动配置类
而且代码及其的饶

按照惯例来张图

BeanDefinitionRegistryPostProcessor

public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
    void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry var1) throws BeansException;
}

springboot应用(不含cloud)一共四个类实现了这个接口

  • CachingMetadataReaderFactoryPostProcessor(autoconfiger包)
  • ConfigurationWarningsPostProcessor(springboot包)
  • ConfigurationClassPostProcessor(spring-context包)
  • WsdlDefinitionBeanFactoryPostProcessor(autoconfiger包)

一眼就可以看出ConfigurationClassPostProcessor 这个类非常重要,context包不会无缘无故实现这个接口的

接口方法-postProcessBeanDefinitionRegistry

 public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
        //生成了一个id,先不管什么用吧
        int registryId = System.identityHashCode(registry);
        if (this.registriesPostProcessed.contains(registryId)) {
            throw new IllegalStateException("postProcessBeanDefinitionRegistry already called on this post-processor against " + registry);
        } else if (this.factoriesPostProcessed.contains(registryId)) {
            throw new IllegalStateException("postProcessBeanFactory already called on this post-processor against " + registry);
        } else {
            this.registriesPostProcessed.add(registryId);
            //关键类在这里
            this.processConfigBeanDefinitions(registry);
        }
    }

processConfigBeanDefinitions

这个类有点长

从这几句开始分析,它前面主要是为这一句做准备吧


  ConfigurationClassParser parser = new ConfigurationClassParser(this.metadataReaderFactory, this.problemReporter, this.environment, this.resourceLoader, this.componentScanBeanNameGenerator, registry);
  Set<BeanDefinitionHolder> candidates = new LinkedHashSet(configCandidates);
  ......
     do {
        ....
        //candidates是候选人的意思
        //此时它是启动类的beandefinition
        /**
        Generic bean: class [com.cui.springboot.Application]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null
        */
        //1.解析各种注入的bean
        parser.parse(candidates);
        //2.验证一下
        parser.validate();
        //处理获取的自动配置类
        Set<ConfigurationClass> configClasses = new LinkedHashSet(parser.getConfigurationClasses());
        configClasses.removeAll(alreadyParsed);
        if (this.reader == null) {
            this.reader = new ConfigurationClassBeanDefinitionReader(registry, this.sourceExtractor, this.resourceLoader, this.environment, this.importBeanNameGenerator, parser.getImportRegistry());
        }
        //加载beanDefinitions
        this.reader.loadBeanDefinitions(configClasses);
        alreadyParsed.addAll(configClasses);
        candidates.clear();
        ....
     } while(!candidates.isEmpty());

这里创建了一个ConfigurationClassParser的类,然后调用解析方法
主要逻辑都在这个parse里

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » ConfigurationClassPostProcessor-1.processConfigBeanDefinitions