ConfigurationClassPostProcessor是所有Bean工厂后置处理器中最先被执行的。下面是他的继承图,实现了BeanDefinitionRegistryPostProcessor和PriorityOrdered。
上一篇讲到refresh的invokeBeanFactoryPostProcessors方法会依次调用BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry和BeanFactoryPostProcesser的postProcessBeanFactory方法。
ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry方法内部调用了processConfigBeanDefinitions。主要作用是拿到BeanFactory中所有的BeanDefinition信息,解析加载处理。
public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
List<BeanDefinitionHolder> configCandidates = new ArrayList<>();
//拿到registry注册的所有的bean
String[] candidateNames = registry.getBeanDefinitionNames();
//遍历所有的bean,根据BeanName获取BeanDefinition
for (String beanName : candidateNames) {
BeanDefinition beanDef = registry.getBeanDefinition(beanName);
if (beanDef.getAttribute(ConfigurationClassUtils.CONFIGURATION_CLASS_ATTRIBUTE) != null) {
if (logger.isDebugEnabled()) {
logger.debug("Bean definition has already been processed as a configuration class: " + beanDef);
}
}//判断是否加了@Configuration注解
else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) {
//把所有的配置类(加了@Configuration)的bean封装成BeanDefinitionHolder加入到集合
configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));
}
}
//没有配置类直接返回
// Return immediately if no @Configuration classes were found
if (configCandidates.isEmpty()) {
return;
}
//按照order的顺序排序
// Sort by previously determined @Order value, if applicable
configCandidates.sort((bd1, bd2) -> {
int i1 = ConfigurationClassUtils.getOrder(bd1.getBeanDefinition());
int i2 = ConfigurationClassUtils.getOrder(bd2.getBeanDefinition());
return Integer.compare(i1, i2);
});
// Detect any custom bean name generation strategy supplied through the enclosing application context
SingletonBeanRegistry sbr = null;
if (registry instanceof SingletonBeanRegistry) {
sbr = (SingletonBeanRegistry) registry;
if (!this.localBeanNameGeneratorSet) {
BeanNameGenerator generator = (BeanNameGenerator) sbr.getSingleton(
AnnotationConfigUtils.CONFIGURATION_BEAN_NAME_GENERATOR);
if (generator != null) {
this.componentScanBeanNameGenerator = generator;
this.importBeanNameGenerator = generator;
}
}
}
if (this.environment == null) {
this.environment = new StandardEnvironment();
}
//解析每一个@Configuration配置类
// Parse each @Configuration class
ConfigurationClassParser parser = new ConfigurationClassParser(
this.metadataReaderFactory, this.problemReporter, this.environment,
this.resourceLoader, this.componentScanBeanNameGenerator, registry);
//存放所有的BeanDefinitionHolder
Set<BeanDefinitionHolder> candidates = new LinkedHashSet<>(configCandidates);
//存放已经处理过的Bean的ConfigurationClass
Set<ConfigurationClass> alreadyParsed = new HashSet<>(configCandidates.size());
//循环处理BeanDefinition
do {
StartupStep processConfig = this.applicationStartup.start("spring.context.config-classes.parse");
//解析BeanDefinition
**parser.parse(candidates);**
parser.validate();
//拿到解析后的BeanDefinition的class
Set<ConfigurationClass