在創(chuàng)建、準(zhǔn)備BeanFactory環(huán)境的流程結(jié)束后,在invokeBeanFactoryPostProcessors方法中,spring開(kāi)始查找項(xiàng)目中定義的BeanFactoryPostProcessor,按照PriorityOrdered->Ordered->normal 順序調(diào)用BeanFactoryPostProcessor的方法,為容器注入新的類(lèi):比如BeanPostProcessor(并沒(méi)有初始化,只是保存了類(lèi)名)。
1. invokeBeanFactoryPostProcessors 方法
invokeBeanFactoryPostProcessors(
ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors){
if (beanFactory instanceof BeanDefinitionRegistry) {
...
//找到BeanFactory創(chuàng)建之初,spring默認(rèn)添加的ConfigurationClassPostProcessor
String[] postProcessorNames =beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
//優(yōu)先執(zhí)行implement了PriorityOrdered 的 BeanDefinitionRegistryPostProcessor
List<BeanDefinitionRegistryPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanDefinitionRegistryPostProcessor>();
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
registryPostProcessors.addAll(priorityOrderedPostProcessors);
invokeBeanDefinitionRegistryPostProcessors(priorityOrderedPostProcessors, registry);
//執(zhí)行implement了Ordered 的 BeanDefinitionRegistryPostProcessor
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
List<BeanDefinitionRegistryPostProcessor> orderedPostProcessors = new ArrayList<BeanDefinitionRegistryPostProcessor>();
for (String ppName : postProcessorNames) {
if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
sortPostProcessors(beanFactory, orderedPostProcessors);
registryPostProcessors.addAll(orderedPostProcessors);
invokeBeanDefinitionRegistryPostProcessors(orderedPostProcessors, registry);
...
//執(zhí)行常規(guī)的BeanDefinitionRegistryPostProcessor 和BeanPostProcessor
invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
}
//同樣按照PriorityOrdered->Ordered->normal 的順序 執(zhí)行非BeanDefinitionRegistryPostProcessor 的BeanFactoryPostProcessor 的方法。
.... 省略...
}
2. ConfigurationClassPostProcessor
在創(chuàng)建BeanFactory時(shí),spring默認(rèn)添加了ConfigurationClassPostProcessor。

ConfigurationClassPostProcessor
ConfigurationClassPostProcessor implement 了BeanDefinitionRegistryPostProcessor 和 PriorityOrdered 接口,于是在 invokeBeanFactoryPostProcessors方法調(diào)用的過(guò)程中,會(huì)調(diào)用ConfigurationClassPostProcessor 的 postProcessBeanDefinitionRegistry, 進(jìn)而在容器中注入新的類(lèi):ImportAwareBeanPostProcessor,EnhancedConfigurationBeanPostProcessor:
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
...
RootBeanDefinition iabpp = new RootBeanDefinition(ImportAwareBeanPostProcessor.class);
iabpp.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
registry.registerBeanDefinition(IMPORT_AWARE_PROCESSOR_BEAN_NAME, iabpp);
RootBeanDefinition ecbpp = new RootBeanDefinition(EnhancedConfigurationBeanPostProcessor.class);
ecbpp.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
registry.registerBeanDefinition(ENHANCED_CONFIGURATION_PROCESSOR_BEAN_NAME, ecbpp);
...
// 注入MainConfig類(lèi)中用@Bean注解的類(lèi)到容器中
processConfigBeanDefinitions(registry);
}
- processConfigBeanDefinitions
public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
...
// Read the model and create bean definitions based on its content
if (this.reader == null) {
this.reader = new ConfigurationClassBeanDefinitionReader(
registry, this.sourceExtractor, this.resourceLoader, this.environment,
this.importBeanNameGenerator, parser.getImportRegistry());
}
this.reader.loadBeanDefinitions(configClasses);
}
- loadBeanDefinitionsForConfigurationClass: 在容器中注入MainConfig中通過(guò)@Bean,@Import,以及ImportBeanDefinitionRegistrars 方式添加的類(lèi)。
private void loadBeanDefinitionsForConfigurationClass(ConfigurationClass configClass,
TrackedConditionEvaluator trackedConditionEvaluator) {
if (trackedConditionEvaluator.shouldSkip(configClass)) {
String beanName = configClass.getBeanName();
if (StringUtils.hasLength(beanName) && this.registry.containsBeanDefinition(beanName)) {
this.registry.removeBeanDefinition(beanName);
}
this.importRegistry.removeImportingClassFor(configClass.getMetadata().getClassName());
return;
}
if (configClass.isImported()) {
registerBeanDefinitionForImportedConfigurationClass(configClass);
}
for (BeanMethod beanMethod : configClass.getBeanMethods()) {
loadBeanDefinitionsForBeanMethod(beanMethod);
}
loadBeanDefinitionsFromImportedResources(configClass.getImportedResources());
loadBeanDefinitionsFromRegistrars(configClass.getImportBeanDefinitionRegistrars());
}