在分析Spring 容器创建过程时,我们知道容器默认会加载一些后置处理器PostPRocessor,以AnnotationConfigApplicationContext为例,在构造函数中初始化reader时,加载默认后置处理器。其中 ConfigurationClassPostProcessor这个后置处理器专门处理带有@Configuration注解的类,ConfigurationClassPostProcessor后置处理实现了BeanDefinitionRegistryPostProcessor接口和PriorityOrdered接口,所以会在容器初始化refres()方法中执行后置处理器时优先执行,主要负责解析所有@Configuration标签类,并将Bean定义注册到容器中。
BeanDefinitionRegistryPostProcessor解析配置类过程:
1 public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) { 2 //生成唯一标识,用于重复处理验证 3 int registryId = System.identityHashCode(registry); 4 if (this.registriesPostProcessed.contains(registryId)) { 5 throw new IllegalStateException( 6 "postProcessBeanDefinitionRegistry already called on this post-processor against " + registry); 7 } 8 if (this.factoriesPostProcessed.contains(registryId)) { 9 throw new IllegalStateException( 10 "postProcessBeanFactory already called on this post-processor against " + registry); 11 } 12 this.registriesPostProcessed.add(registryId); 13 //解析Java类配置bean14 processConfigBeanDefinitions(registry); 15 }
processConfigBeanDefinitions(registry)处理逻辑:1 public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) { 2 List<BeanDefinitionHolder> configCandidates = new ArrayList<>(); 3 //所有已经注册的bean 4 String[] candidateNames = registry.getBeanDefinitionNames(); 5 //遍历bean定义信息 6 for (String beanName : candidateNames) { 7 BeanDefinition beanDef = registry.getBeanDefinition(beanName); 8 if (ConfigurationClassUtils.isFullConfigurationClass(beanDef) || 9 ConfigurationClassUtils.isLiteConfigurationClass(beanDef)) { 10 if (logger.isDebugEnabled()) { 11 logger.debug("Bean definition has already been processed as a configuration class: " + beanDef); 12 } 13 } 14 //如果当前的bean是Javabean配置类(含有@Configuration注解的类),则加入到集合configCandidates中, 15 else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) { 16 configCandidates.add(new BeanDefinitionHolder(beanDef, beanName)); 17 } 18 } 19 20 // Return immediately if no @Configuration cla

