添加ConfigurationClassPostProcessor 处理配置类

注解得解析 BeanDefinition 需要 BeanDefinitionReader 读取BeanDefinition

  • 在调用refresh 之前 调用父类得构造方法
  • 在父类得构造方法中 创建DefinitionReader
  • 在 new AnnotatedBeanDefinitionReader() 得时候 使用 AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry); 在这里边就 注册了很多得beanDefinition (重要得几个如下)
    • ConfigurationClassPostProcessor (配置注解后置处理器) 名字-internalConfigurationAnnotationProcessor (重要)
    • AutowiredAnnotationBeanPostProcessor (自动注入后置处理器) 名字- internalAutowiredAnnotationProcessor
    • CommonAnnotationBeanPostProcessor (JSR-250 annotation processor) 名字 - internalCommonAnnotationProcessor
    • EventListenerMethodProcessor ( @EventListener annotation processor.)

在 refresh 的 invokeBeanFactoryPostProcessors 就开始使用 上面的 ConfigurationClassPostProcessor 解析beanDefinition 了

ConfigurationClassPostProcessor 解析BeanDefinition

是BeanDefinitionRegistryPostProcessor 的子类 所以第一步就执行 postProcessBeanDefinitionRegistry 方法

  • 进入 ——>postProcessBeanDefinitionRegistry 方法
    • _checkConfigurationClassCandidate 方法判断是否有 @Configuration 注解 加入 _configCandidates 中
    • 创建ConfigurationClassParser 调用——>parse 方法开始解析
    • 直接调入到processConfigurationClass 方法 conditionEvaluator.shouldSkip 里面判断了Conditional 注解 ——>doProcessConfigurationClass
      • 首先处理了 该类里面的成员类 中的Component
      • ComponentScans 和 ComponentScan 注解的处理

有两个上面两个注解 开始扫描BeanDefinition
进入 ——> this.componentScanParser.parse(componentScan, sourceClass.getMetadata().getClassName());

  • 使用ClassPathBeanDefinitionScanner 设置配置的属性 useDefaultFilters includeFilters

    excludeFilters basePackages
    ——> scanner.doScan(StringUtils.toStringArray(basePackages));

  • ——> findCandidateComponents

  • isCandidateComponent(metadataReader) 根据 TypeFilter 来匹配和删除