开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情
public void refresh() throws BeansException, IllegalStateException {
synchronized(this.startupShutdownMonitor) {
try {
.....
// 5. 执行BeanFactory后置处理器
this.invokeBeanFactoryPostProcessors(beanFactory);
.....
}
}
}
五、执行BeanFactory后置处理器(invokeBeanFactoryPostProcessors)
先获取所有Bean工厂后处理器再执行
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
5.1~5.4 执行DefinitionRegistryPostProcessor(执行注册表后置处理器)
Set<String> processedBeans = new HashSet<>();
//如果beanFactory是注册器
if (beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
//5.1遍历所有beanFactory后置处理器,找出BeanDefinition后置处理器
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
BeanDefinitionRegistryPostProcessor registryProcessor =
(BeanDefinitionRegistryPostProcessor) postProcessor;
//5.1.1执行BeanDefinition后置处理器方法
registryProcessor.postProcessBeanDefinitionRegistry(registry);
registryProcessors.add(registryProcessor);
}
else {
regularPostProcessors.add(postProcessor);
}
}
// Do not initialize FactoryBeans here: We need to leave all regular beans
// uninitialized to let the bean factory post-processors apply to them!
// Separate between BeanDefinitionRegistryPostProcessors that implement
// PriorityOrdered, Ordered, and the rest.
List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
//5.2从注册表中获取所有BeanDefinition后置处理器
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
//5.2.1找出实现了PriorityOrdered接口的BeanDefinition后置处理器
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
//5.2.2实例化实现了PriorityOrdered接口的BeanDefinition后置处理器
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
//5.2.3 对实现了PriorityOrdered接口的BeanDefinition后置处理器进行排序
sortPostProcessors(currentRegistryProcessors, beanFactory);
//5.2.4 添加进待执行列表中
registryProcessors.addAll(currentRegistryProcessors);
//5.2.5 执行BeanDefinition后置处理器方法
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
//5.2.6 清空待执行列表
currentRegistryProcessors.clear();
// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
//5.3从注册表中获取所有BeanDefinition后置处理器
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
//5.3.1找出实现了Ordered接口的BeanDefinition后置处理器
if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
//5.3.2实例化实现了Ordered接口的BeanDefinition后置处理器
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
//5.3.3 对实现了Ordered接口的BeanDefinition后置处理器进行排序
sortPostProcessors(currentRegistryProcessors, beanFactory);
//5.3.4 添加进待执行列表中
registryProcessors.addAll(currentRegistryProcessors);
//5.3.5 执行BeanDefinition后置处理器方法
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
//5.3.6 清空待执行列表
currentRegistryProcessors.clear();
// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
boolean reiterate = true;
while (reiterate) {
reiterate = false;
//5.4从注册表中获取所有BeanDefinition后置处理器
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
//5.4.1找出没有执行过的(没有实现PriorityOrdered和Ordered接口)BeanDefinition后置处理器
for (String ppName : postProcessorNames) {
if (!processedBeans.contains(ppName)) {
//5.4.2实例化没有执行过的的BeanDefinition后置处理器
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
reiterate = true;
}
}
//5.4.3 对没有执行过的BeanDefinition后置处理器进行排序
sortPostProcessors(currentRegistryProcessors, beanFactory);
//5.4.4 添加进待执行列表中
registryProcessors.addAll(currentRegistryProcessors);
//5.4.5 执行BeanDefinition后置处理器方法
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
//5.4.6 清空待执行列表
currentRegistryProcessors.clear();
}
// Now, invoke the postProcessBeanFactory callback of all processors handled so far.
//5.5执行BeanFactory后置处理器(实现了BeanDefinition后置处理器)
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
//5.5执行BeanFactory后置处理器(没有实现BeanDefinition后置处理器)
invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
}else {
//5.5执行BeanFactory后置处理器
invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
}
5.1.1 【重要组件】ConfigurationClassPostProcessor
详细解析地址: juejin.cn/post/720401…
5.1.1.1 创建时机
AnnotatedBeanDefinitionReader在AnnotationConfigServletWebServerApplicationContext的构造器中被创建
ConfigurationClassPostProcessor的BeanDefinition是在AnnotatedBeanDefinitionReader的构造器中被放入注册表中的,并且在5.2.2时被创建
public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
Assert.notNull(environment, "Environment must not be null");
this.registry = registry;
this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
//注册ConfigurationClassPostProcessor
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
}
5.1.1.2 执行时机
ConfigurationClassPostProcessor在5.2.5时会执行postProcessBeanDefinitionRegistry会加载包下所有配置类
5.4~5.9 执行BeanFactoryPostProcessor(执行BeanFactory后置处理器)
//5.6获取注册表中BeanFactoryPostProcessor后置处理器
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
List<String> orderedPostProcessorNames = new ArrayList<>();
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
for (String ppName : postProcessorNames) {
//如果processedBeans中有说明已经执行过了(在5.5中)
if (processedBeans.contains(ppName)) {
}//如果PriorityOrdered接口
else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
//5.7创建Bean
priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
}//如果Ordered接口
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}//不需要排序的接口
else {
nonOrderedPostProcessorNames.add(ppName);
}
}
//5.7.1对PriorityOrdered接口的进行排序
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
//5.7.2执行BeanFactoryPostProcessors后置处理器
invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
for (String postProcessorName : orderedPostProcessorNames) {
//5.8创建Bean
orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
//5.8.1对Ordered接口的进行排序
sortPostProcessors(orderedPostProcessors, beanFactory);
//5.8.2执行BeanFactoryPostProcessors后置处理器
invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
for (String postProcessorName : nonOrderedPostProcessorNames) {
//5.9创建Bean
nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
//5.9.1执行BeanFactoryPostProcessors后置处理器
invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
//5.10 清除缓存
beanFactory.clearMetadataCache();
总结:
- 所有的BeanDefinitionRegistryPostProcessor被执行,接着会执行所有的BeanFactoryPostProcessor
- ConfigurationClassPostProcessor在这里会被创建,然后会加载包下所有配置类(@ComponentScan)