前言
前面讲了reser方法,
PostProcessorRegistrationDelegate核心方法
- invokeBeanFactoryPostProcessors
执行BeanDefinitionRegistry接口与 BeanDefinitionRegistryPostProcessor接口的实现类
- registerBeanPostProcessors
BeanDefinitionRegistry的子类进行排序
invokeBeanFactoryPostProcessors解读
- 执行invokeBeanFactoryPostProcessors方法形参beanFactoryPostProcessors里面的BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry
- 执行beanFactory里面的BeanDefinitionRegistryPostProcessor实现类的postProcessBeanDefinitionRegistry的postProcessBeanDefinitionRegistry方法
- 循环得到beanFactory里面的BeanDefinitionRegistryPostProcessor实现类的postProcessBeanDefinitionRegistry方法
- 在执行BeanDefinitionRegistryPostProcessor的实现类的postProcessBeanFactory方法
- 在执行invokeBeanFactoryPostProcessors方法形参beanFactoryPostProcessors里面的BeanFactoryPostProcessor实现类的postProcessBeanFactory方法
- 执行beanFactory里面的BeanFactoryPostProcessor实现类的postProcessBeanFactory方法
- 进行排序在执行实现类,排序分类是先对实现PriorityOrdered的类进行排序并执行,在对实现Ordered的类进行排序并执行,最后对其他类执行。
public static void invokeBeanFactoryPostProcessors(
ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
// Invoke BeanDefinitionRegistryPostProcessors first, if any.
Set<String> processedBeans = new HashSet<String>();
if (beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
List<BeanFactoryPostProcessor> regularPostProcessors = new LinkedList<BeanFactoryPostProcessor>();
List<BeanDefinitionRegistryPostProcessor> registryProcessors = new LinkedList<BeanDefinitionRegistryPostProcessor>();
// 执行invokeBeanFactoryPostProcessors方法形参beanFactoryPostProcessors里面的BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
BeanDefinitionRegistryPostProcessor registryProcessor =
(BeanDefinitionRegistryPostProcessor) postProcessor;
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<BeanDefinitionRegistryPostProcessor>();
// 执行beanFactory里面的BeanDefinitionRegistryPostProcessor与PriorityOrdered实现类的postProcessBeanDefinitionRegistrypostProcessBeanDefinitionRegistry方法
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
sortPostProcessors(currentRegistryProcessors, beanFactory);
registryProcessors.addAll(currentRegistryProcessors);
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
// 执行beanFactory里面的BeanDefinitionRegistryPostProcessor与Ordered实现类的postProcessBeanDefinitionRegistrypost方法
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
sortPostProcessors(currentRegistryProcessors, beanFactory);
registryProcessors.addAll(currentRegistryProcessors);
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
// 循环得到beanFactory里面的BeanDefinitionRegistryPostProcessor实现类的postProcessBeanDefinitionRegistry方法。会排除已经执行的对象
boolean reiterate = true;
while (reiterate) {
reiterate = false;
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
if (!processedBeans.contains(ppName)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
reiterate = true;
}
}
sortPostProcessors(currentRegistryProcessors, beanFactory);
registryProcessors.addAll(currentRegistryProcessors);
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
}
// 在执行BeanDefinitionRegistryPostProcessor的实现类的postProcessBeanFactory方法
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
// 在执行invokeBeanFactoryPostProcessors方法形参beanFactoryPostProcessors里面的BeanFactoryPostProcessor实现类的postProcessBeanFactory方法
invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
}
else {
// Invoke factory processors registered with the context instance.
invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, 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.
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 (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
}
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}
else {
nonOrderedPostProcessorNames.add(ppName);
}
}
// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
// Next, invoke the BeanFactoryPostProcessors that implement Ordered.
List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
for (String postProcessorName : orderedPostProcessorNames) {
orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
sortPostProcessors(orderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
// Finally, invoke all other BeanFactoryPostProcessors.
List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
for (String postProcessorName : nonOrderedPostProcessorNames) {
nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
// Clear cached merged bean definitions since the post-processors might have
// modified the original metadata, e.g. replacing placeholders in values...
beanFactory.clearMetadataCache();
}
BeanFactoryPostProcessor体系
BeanFactoryPostProcessor体系主要是由BeanFactoryPostProcessor与子接口BeanDefinitionRegistryPostProcessor构成
BeanFactoryPostProcessor可以对ConfigurableListableBeanFactory对象进行操作。
public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
- BeanDefinitionRegistryPostProcessor调用BeanDefinitionRegistry.registerBeanDefinition的方法注册BeanDefinition
- BeanDefinitionRegistryPostProcessor调用BeanDefinitionRegistry.registerBeanDefinition的方法注册BeanDefinition
- BeanDefinitionRegistryPostProcessor调用BeanDefinitionRegistry.registerBeanDefinition的方法注册BeanDefinition
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
}
上面有一句这样的话:循环得到beanFactory里面的BeanDefinitionRegistryPostProcessor实现类的postProcessBeanDefinitionRegistry方法。会排除已经执行的对象。大家是不是能难理解。比如BeanDefinitionRegistryPostProcessor的实现类A向BeanDefinitionRegistry注册了BeanDefinitionRegistryPostProcessor的实现类B.然后B注册了C。那B,C如何被执行。可以通过上面标注的循环的代码就可以解决了。
基于BeanDefinitionRegistryPostProcessor实现spring 扫描默认路径下的class
注册ConfigurationClassPostProcessor
AnnotationConfigUtils的registerAnnotationConfigProcessors会向BeanDefinitionRegistry注册ConfigurationClassPostProcessor。
public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
BeanDefinitionRegistry registry, @Nullable Object source) {
.......
Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(4);
if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
}
.......
return beanDefs;
}
调用链
AnnotationConfigApplicationContext,AnnotationConfigServletWebServerApplicationContext,AnnotationConfigReactiveWebServerApplicationContext都是默认的注解app上下文容器,所有的AnnotationConfigs都会默认注册ConfigurationClassPostProcessor。
总结
- PostProcessorRegistrationDelegate 是applincationContext最关键的类之一
- BeanFactoryPostProcessor是整个applincationContext最核心的体系,mybatis的mapper,dubbo的server都是给予BeanFactoryPostProcessor体系实现
- 所有AnnotationConfig上线文都会注册ConfigurationClassPostProcessor