2019.10.22笔记——spring内部扫描分析之invokeBeanFactoryPostProcessors解析
作者:互联网
invokeBeanFactoryPostProcessors方法
对于spring扫描的整体流程前面已经分析过了,可以参考下面文章中对ClassPathBeanDefinitionScanner的分析。
spring中的ClassPathBeanDefinitionScanner
这里只是分析扫描过程中的invokeBeanFactoryPostProcessors
方法
在这个方法中主要实现了spring bean工厂的后置处理器的方法回调,spring bean工厂的后置处理器主要分为两类
- BeanFactoryPostProcessor
- BeanDefinitionRegistryPostProcessor
其中BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子类
public static void invokeBeanFactoryPostProcessors(
ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
// Invoke BeanDefinitionRegistryPostProcessors first, if any.
Set<String> processedBeans = new HashSet<>();
//这个bean工厂是DefaultListableBeanFactory,DefaultListableBeanFactory同样实现了BeanDefinitionRegistry
if (beanFactory instanceof BeanDefinitionRegistry) {
//这个bean工厂同样也是一个注册器
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
//这个list要放的是使用者自定义的BeanFactoryPostProcessor的是实现
List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
//BeanDefinitionRegistryPostProcessor同样也是spring的扩展点之一,同时也是BeanFactoryPostProcessor的子类
//使用者也可以实现这个BeanDefinitionRegistryPostProcessor接口来做一些增强
//这个list要放的是使用者自定义的BeanDefinitionRegistryPostProcessor的是实现
List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
//判断传进来的对象是属于实现了哪一个接口的实现类,并加入对应的set集合
//循环遍历使用者自定义的BeanFactoryPostProcessor的实现
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
BeanDefinitionRegistryPostProcessor registryProcessor =
(BeanDefinitionRegistryPostProcessor) postProcessor;
// 这里直接执行使用者通过api传进来的BeanDefinitionRegistryPostProcessor实现类中的方法
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.
// 这里又创建了一个set集合,存放的同样是BeanDefinitionRegistryPostProcessor
// 因为不只有使用者会实现BeanDefinitionRegistryPostProcessor
// 这个集合是装的spring内部自己是实现的BeanDefinitionRegistryPostProcessor的对象
// 为了区分又创建了一个set集合来存储
List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
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);
//将用户的BeanDefinitionRegistryPostProcessor实现类和spring自己的是实现类的集合做了合并
registryProcessors.addAll(currentRegistryProcessors);
/**
* 完成扫描
* 这里将所有的BeanDefinitionRegistryPostProcessor的实现和注册器传了过去
* 这个方法也执行了所有的BeanDefinitionRegistryPostProcessor(包括自定义的和spring内部的)中实现的方法
* 十分重要
* 完成了绝大部分的bd的注册
*/
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
// 清除list集合,节省空间
currentRegistryProcessors.clear();
// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
// 找到所有实现Order接口的BeanDefinitionRegistryPostProcessors
// 这个Order接口是用来决定执行顺序的
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();
// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
boolean reiterate = true;
// 这里之所以会需要循环是因为有可能在回调postProcessBeanDefinitionRegistry方法的时候可能会新注册BeanDefinitionRegistryPostProcessor的bean对象
// 这是为了保障找到所有BeanDefinitionRegistryPostProcessor的实现类
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();
}
// Now, invoke the postProcessBeanFactory callback of all processors handled so far.
/**
* 这里开始执行BeanFactoryPostProcessors的实现类的回调方法
* 注意这里执行了两遍是因为registryProcessors虽然是BeanDefinitionRegistryPostProcessor的实现类
* 但是同样也是BeanFactoryPostProcessors的子类,所以同样也实现了BeanFactoryPostProcessors的方法
* 所以也需要调用
* 后面的invokeBeanFactoryPostProcessors方法则是传入BeanFactoryPostProcessor的实现类
*/
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
}
else {
// Invoke factory processors registered with the context instance.
invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
}
/**
* 后面就是对所有BeanFactoryPostProcessor实现类(除了使用者通过api注入的)执行回调方法
*/
// Do not initialize FactoryBeans here: We need to leave all regular beans
// uninitialized to let the bean factory post-processors apply to them!
// 找到所有BeanFactoryPostProcessor实现类
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
// Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
// Ordered, and the rest.
List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
List<String> orderedPostProcessorNames = new ArrayList<>();
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
for (String ppName : postProcessorNames) {
if (processedBeans.contains(ppName)) {
// skip - already processed in first phase above
}
// 实现了PriorityOrdered接口的
else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
}
// 实现类Ordered接口的
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}
// 没有实现排序接口的
else {
nonOrderedPostProcessorNames.add(ppName);
}
}
// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
// 首先排序并执行实现了PriorityOrdered接口的实现类
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
// 回调postProcessBeanFactory方法
invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
// Next, invoke the BeanFactoryPostProcessors that implement Ordered.
// 接下来排序并执行实现了Ordered接口的实现类
List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();
for (String postProcessorName : orderedPostProcessorNames) {
orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
sortPostProcessors(orderedPostProcessors, beanFactory);
// 回调postProcessBeanFactory方法
invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
// Finally, invoke all other BeanFactoryPostProcessors.
// 最后执行剩余的BeanFactoryPostProcessor实现类的回调方法postProcessBeanFactory
List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
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();
}
在这个方法中主要完成了下面几个步骤
- 首先会将使用者传递进来的BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor实现类拿到,并分别放到两个list中,regularPostProcessors存放着实现了BeanFactoryPostProcessor的,registryProcessors存放着实现了BeanDefinitionRegistryPostProcessor的。注意这里的使用者自定义的处理器并不是通过注解方式注入的,而是通过api方法注入的。是通过
AnnotationConfigApplicationContext.addBeanFactoryPostProcessor()
方法注入的。同时在找到BeanDefinitionRegistryPostProcessor的实现类会直接回调postProcessBeanDefinitionRegistry
方法。 - 接着会将spring内部已经注入的BeanDefinitionRegistryPostProcessor的实现类找出来,这里其实spring内部只是注入了一个实现类,不过相当重要,这个对象就是是ConfigurationClassPostProcessor,它完成了spring的许多工作,这里将它拿出来,放到一个currentRegistryProcessors集合中。
- 将使用者自己实现的BeanDefinitionRegistryPostProcessor实现类和spring内部的BeanDefinitionRegistryPostProcessor实现类通通聚合到currentRegistryProcessors集合中,接着执行接口中的
postProcessBeanDefinitionRegistry
方法(方法回调),在spring内部的实现类回调方法中,也就是ConfigurationClassPostProcessor中完成了对bean的扫描。 - 将currentRegistryProcessors集合清空,接着会从bd的map中拿到所有的BeanDefinitionRegistryPostProcessor是实现类,同时实现了Ordered接口,这里的Ordered接口其实就是决定后面回调执行顺序的,将这些处理器对象放入currentRegistryProcessors和registryProcessors集合中,接着回调执行处理器中的
postProcessBeanDefinitionRegistry
方法。 - 接着继续清空currentRegistryProcessors集合,从map中拿到剩余的BeanDefinitionRegistryPostProcessor实现类,将这些处理器对象放入currentRegistryProcessors和registryProcessors集合中,接着回调执行处理器中的
postProcessBeanDefinitionRegistry
方法。注意这里之所以会需要循环是因为有可能在回调postProcessBeanDefinitionRegistry方法的时候可能会新注册BeanDefinitionRegistryPostProcessor的bean对象,这是为了保障找到所有BeanDefinitionRegistryPostProcessor的实现类。 - if语句最后执行registryProcessors和regularPostProcessors集合中处理器的
postProcessBeanFactory
方法,这里先是执行的BeanDefinitionRegistryPostProcessor实现类的postProcessBeanFactory
方法,再执行的BeanFactoryPostProcessor的postProcessBeanFactory
方法。 - 最后就是对所有BeanFactoryPostProcessor实现类(除了使用者通过api注入的)执行回调方法,同样是分为三类,实现PriorityOrdered接口的,实现Ordered接口的和没有实现排序接口的。
总结
- 这个方法中主要是对BeanFactoryPostProcessors和BeanDefinitionRegistryPostProcessor是实现类的回调方法的调用。
- 针对的实现类包括通过API
AnnotationConfigApplicationContext.addBeanFactoryPostProcessor()
注入的BeanFactoryPostProcessors和BeanDefinitionRegistryPostProcessor的实现类,spring内部的BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessors实现类,扫描出来的BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessors实现类。 - 它们的回调方法执行顺序如下
- 通过API
AnnotationConfigApplicationContext.addBeanFactoryPostProcessor()
注入的BeanDefinitionRegistryPostProcessor的实现类的postProcessBeanDefinitionRegistry
方法。 - spring内部的BeanDefinitionRegistryPostProcessor实现类的
postProcessBeanDefinitionRegistry
方法。 - 扫描出来的BeanDefinitionRegistryPostProcessor实现类,且实现了Order接口,执行
postProcessBeanDefinitionRegistry
方法。 - 其余所有其他BeanDefinitionRegistryPostProcessor实现类,执行
postProcessBeanDefinitionRegistry
方法。 - 通过API
AnnotationConfigApplicationContext.addBeanFactoryPostProcessor()
注入的BeanDefinitionRegistryPostProcessor的实现类、spring内部的BeanDefinitionRegistryPostProcessor实现类和扫描出来的BeanDefinitionRegistryPostProcessor实现类的postProcessBeanFactory
方法。 - 通过API
AnnotationConfigApplicationContext.addBeanFactoryPostProcessor()
注入的BeanFactoryPostProcessors的postProcessBeanFactory
方法。 - 扫描出来和spring内部的BeanFactoryPostProcessors和PriorityOrdered的实现类的
postProcessBeanFactory
方法。 - 扫描出来和spring内部的BeanFactoryPostProcessors和Ordered的实现类的
postProcessBeanFactory
方法。 - 扫描出来和spring内部的剩余的BeanFactoryPostProcessors实现类的
postProcessBeanFactory
方法。
标签:22,beanFactory,实现,spring,ppName,invokeBeanFactoryPostProcessors,currentRegistryP 来源: https://blog.csdn.net/qq_35262405/article/details/102692115