tips
- 如果
beanFactory是BeanDefinitionRegistry的子类,则会又一次机会再次创建和注册BeanDefiniton。(通过BeanDefinitionRegistryPostProcessor接口) - 存在手动注册和资源文件配置的
BeanFactoryPostProcessors - 按照
PriorityOrdered和Ordered,常规的进行排序。其中PriorityOrdered和Ordered可以组合使用。
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
// Invoke BeanDefinitionRegistryPostProcessors first, if any.
Set<String> processedBeans = new HashSet<String>();
//如果beanFactory是BeanDefinitionRegistry,则可以在此之前再次进行新的beanDefinition的定义和注册
//key实现默认的BeanDefinition的注入
if (beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
List<BeanFactoryPostProcessor> regularPostProcessors = new LinkedList<BeanFactoryPostProcessor>();
List<BeanDefinitionRegistryPostProcessor> registryPostProcessors =
new LinkedList<BeanDefinitionRegistryPostProcessor>();
//收集手动注入BeanFactoryPostProcessor,getBeanFactoryPostProcessors
for (BeanFactoryPostProcessor postProcessor : getBeanFactoryPostProcessors()) {
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
BeanDefinitionRegistryPostProcessor registryPostProcessor =
(BeanDefinitionRegistryPostProcessor) postProcessor;
//首先调用BeanDefinitionRegistryPostProcessor的方法,然后在收集起来
registryPostProcessor.postProcessBeanDefinitionRegistry(registry);
registryPostProcessors.add(registryPostProcessor);
}
else {
regularPostProcessors.add(postProcessor);
}
}
//获取配置资源里面配置的BeanFactoryPostProcessor
Map<String, BeanDefinitionRegistryPostProcessor> beanMap =
beanFactory.getBeansOfType(BeanDefinitionRegistryPostProcessor.class, true, false);
List<BeanDefinitionRegistryPostProcessor> registryPostProcessorBeans =
new ArrayList<BeanDefinitionRegistryPostProcessor>(beanMap.values());
//BeanFactoryPostProcessor 排序
OrderComparator.sort(registryPostProcessorBeans);
for (BeanDefinitionRegistryPostProcessor postProcessor : registryPostProcessorBeans) {
postProcessor.postProcessBeanDefinitionRegistry(registry);
}
//调用手动注册的BeanDefinitionRegistryPostProcessor的postProcessBeanFactory
invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory);
//调用配置资源里面的BeanDefinitionRegistryPostProcessor的postProcessBeanFactory
invokeBeanFactoryPostProcessors(registryPostProcessorBeans, beanFactory);
//调用普通的BeanDefinitionPostProcessor
invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
processedBeans.addAll(beanMap.keySet());
}
else {
// Invoke factory processors registered with the context instance.
//直接调用手动注册的普通的BeanFactoryPostProcessors
invokeBeanFactoryPostProcessors(getBeanFactoryPostProcessors(), beanFactory);
}
// Do not initialize FactoryBeans here: We need to leave all regular beans
// uninitialized to let the bean factory post-processors apply to them!
//获取普通的
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
// Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
// Ordered, and the rest.
//分类收集 继承PriorityOrdered的BeanFactoryPostProcessors,继承Ordered的BeanFactoryPostProcessors,然后是无排序的
List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
List<String> orderedPostProcessorNames = new ArrayList<String>();
List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
for (String ppName : postProcessorNames) {
if (processedBeans.contains(ppName)) {
// skip - already processed in first phase above
}
else if (isTypeMatch(ppName, PriorityOrdered.class)) {
priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
}
else if (isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}
else {
nonOrderedPostProcessorNames.add(ppName);
}
}
// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
//PriorityOrdered 和ordered可以混用
OrderComparator.sort(priorityOrderedPostProcessors);
invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
// Next, invoke the BeanFactoryPostProcessors that implement Ordered.
List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
for (String postProcessorName : orderedPostProcessorNames) {
orderedPostProcessors.add(getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
OrderComparator.sort(orderedPostProcessors);
invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
// Finally, invoke all other BeanFactoryPostProcessors.
List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
for (String postProcessorName : nonOrderedPostProcessorNames) {
nonOrderedPostProcessors.add(getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
}
流程描述
-
如果
beanFactory实现了BeanDefinitionRegistry- 查找所有的
BeanDefinitionRegistryPostProcessor.先处理BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry(BeanDefinitionRegistry)方法. - 处理顺序是先处理实现
PriorityOrdered的,然后是实现Ordered接口的.再然后是普通的BeanDefinitionRegistryPostProcessor. - 因为
postProcessBeanDefinitionRegistry(BeanDefinitionRegistry)会向BeanDefinitionRegistry(也就是beanfactory)中add新的BeanDefinition,所以处理每一个BeanDefinitionRegistryPostProcessor的时候都要再次通过beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false)获取新的BeanDefinitionRegistryPostProcessor
- 查找所有的
-
如果没有实现
BeanDefinitionRegistry接口,则也按照上面的顺序依次处理所有的BeanFactoryPostProcessor.