Spring IoC源码学习:invokeBeanFactoryPostProcessors 详解

// Invoke BeanDefinitionRegistryPostProcessors first, if any.

Set processedBeans = new HashSet();

// 1.判断beanFactory是否为BeanDefinitionRegistry,beanFactory为DefaultListableBeanFactory,

// 而DefaultListableBeanFactory实现了BeanDefinitionRegistry接口,因此这边为true

if (beanFactory instanceof BeanDefinitionRegistry) {

BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;

// 用于存放普通的BeanFactoryPostProcessor

List regularPostProcessors = new LinkedList();

// 用于存放BeanDefinitionRegistryPostProcessor

List registryProcessors = new LinkedList();

// 2.首先处理入参中的beanFactoryPostProcessors

// 遍历所有的beanFactoryPostProcessors, 将BeanDefinitionRegistryPostProcessor和普通BeanFactoryPostProcessor区分开

for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {

if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {

// 2.1 如果是BeanDefinitionRegistryPostProcessor

BeanDefinitionRegistryPostProcessor registryProcessor =

(BeanDefinitionRegistryPostProcessor) postProcessor;

// 2.1.1 直接执行BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry方法

registryProcessor.postProcessBeanDefinitionRegistry(registry);

// 2.1.2 添加到registryProcessors(用于最后执行postProcessBeanFactory方法)

registryProcessors.add(registryProcessor);

} else {

// 2.2 否则,只是普通的BeanFactoryPostProcessor

// 2.2.1 添加到regularPostProcessors(用于最后执行postProcessBeanFactory方法)

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.

// 用于保存本次要执行的BeanDefinitionRegistryPostProcessor

List currentRegistryProcessors = new ArrayList();

// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.

// 3.调用所有实现PriorityOrdered接口的BeanDefinitionRegistryPostProcessor实现类

// 3.1 找出所有实现BeanDefinitionRegistryPostProcessor接口的Bean的beanName

String[] postProcessorNames =

beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);

// 3.2 遍历postProcessorNames

for (String ppName : postProcessorNames) {

// 3.3 校验是否实现了PriorityOrdered接口

if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {

// 3.4 获取ppName对应的bean实例, 添加到currentRegistryProcessors中,

// beanFactory.getBean: 这边getBean方法会触发创建ppName对应的bean对象, 目前暂不深入解析

currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));

// 3.5 将要被执行的加入processedBeans,避免后续重复执行

processedBeans.add(ppName);

}

}

// 3.6 进行排序(根据是否实现PriorityOrdered、Ordered接口和order值来排序)

sortPostProcessors(currentRegistryProcessors, beanFactory);

// 3.7 添加到registryProcessors(用于最后执行postProcessBeanFactory方法)

registryProcessors.addAll(currentRegistryProcessors);

// 3.8 遍历currentRegistryProcessors, 执行postProcessBeanDefinitionRegistry方法

invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);

// 3.9 执行完毕后, 清空currentRegistryProcessors

currentRegistryProcessors.clear();

// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.

// 4.调用所有实现了Ordered接口的BeanDefinitionRegistryPostProcessor实现类(过程跟上面的步骤3基本一样)

// 4.1 找出所有实现BeanDefinitionRegistryPostProcessor接口的类, 这边重复查找是因为执行完上面的BeanDefinitionRegistryPostProcessor,

// 可能会新增了其他的BeanDefinitionRegistryPostProcessor, 因此需要重新查找

postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);

for (String ppName : postProcessorNames) {

// 校验是否实现了Ordered接口,并且还未执行过

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);

// 4.2 遍历currentRegistryProcessors, 执行postProcessBeanDefinitionRegistry方法

invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);

currentRegistryProcessors.clear();

// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.

// 5.最后, 调用所有剩下的BeanDefinitionRegistryPostProcessors

boolean reiterate = true;

while (reiterate) {

reiterate = false;

// 5.1 找出所有实现BeanDefinitionRegistryPostProcessor接口的类

postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);

for (String ppName : postProcessorNames) {

// 5.2 跳过已经执行过的

if (!processedBeans.contains(ppName)) {

currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));

processedBeans.add(ppName);

// 5.3 如果有BeanDefinitionRegistryPostProcessor被执行, 则有可能会产生新的BeanDefinitionRegistryPostProcessor,

// 因此这边将reiterate赋值为true, 代表需要再循环查找一次

reiterate = true;

}

}

sortPostProcessors(currentRegistryProcessors, beanFactory);

registryProcessors.addAll(currentRegistryProcessors);

// 5.4 遍历currentRegistryProcessors, 执行postProcessBeanDefinitionRegistry方法

invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);

currentRegistryProcessors.clear();

}

// Now, invoke the postProcessBeanFactory callback of all processors handled so far.

// 6.调用所有BeanDefinitionRegistryPostProcessor的postProcessBeanFactory方法(BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcessor)

invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);

// 7.最后, 调用入参beanFactoryPostProcessors中的普通BeanFactoryPostProcessor的postProcessBeanFactory方法

invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);

} else {

// Invoke factory processors registered with the context instance.

invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);

}

// 到这里 , 入参beanFactoryPostProcessors和容器中的所有BeanDefinitionRegistryPostProcessor已经全部处理完毕,

// 下面开始处理容器中的所有BeanFactoryPostProcessor

// Do not initialize FactoryBeans here: We need to leave all regular beans

// uninitialized to let the bean factory post-processors apply to them!

// 8.找出所有实现BeanFactoryPostProcessor接口的类

String[] postProcessorNames =

beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

// Separate between BeanFactoryPostProcessors that implement PriorityOrdered,

// Ordered, and the rest.

// 用于存放实现了PriorityOrdered接口的BeanFactoryPostProcessor

List priorityOrderedPostProcessors = new ArrayList();

// 用于存放实现了Ordered接口的BeanFactoryPostProcessor的beanName

List orderedPostProcessorNames = new ArrayList();

// 用于存放普通BeanFactoryPostProcessor的beanName

List nonOrderedPostProcessorNames = new ArrayList();

// 8.1 遍历postProcessorNames, 将BeanFactoryPostProcessor按实现PriorityOrdered、实现Ordered接口、普通三种区分开

for (String ppName : postProcessorNames) {

// 8.2 跳过已经执行过的

if (processedBeans.contains(ppName)) {

// skip - already processed in first phase above

} else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {

// 8.3 添加实现了PriorityOrdered接口的BeanFactoryPostProcessor

priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));

} else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {

// 8.4 添加实现了Ordered接口的BeanFactoryPostProcessor的beanName

orderedPostProcessorNames.add(ppName);

} else {

// 8.5 添加剩下的普通BeanFactoryPostProcessor的beanName

nonOrderedPostProcessorNames.add(ppName);

}

}

// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.

// 9.调用所有实现PriorityOrdered接口的BeanFactoryPostProcessor

// 9.1 对priorityOrderedPostProcessors排序

sortPostProcessors(priorityOrderedPostProcessors, beanFactory);

// 9.2 遍历priorityOrderedPostProcessors, 执行postProcessBeanFactory方法

invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

// Next, invoke the BeanFactoryPostProcessors that implement Ordered.

// 10.调用所有实现Ordered接口的BeanFactoryPostProcessor

List orderedPostProcessors = new ArrayList();

for (String postProcessorName : orderedPostProcessorNames) {

// 10.1 获取postProcessorName对应的bean实例, 添加到orderedPostProcessors, 准备执行

orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));

}

// 10.2 对orderedPostProcessors排序

sortPostProcessors(orderedPostProcessors, beanFactory);

// 10.3 遍历orderedPostProcessors, 执行postProcessBeanFactory方法

invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

// Finally, invoke all other BeanFactoryPostProcessors.

// 11.调用所有剩下的BeanFactoryPostProcessor

List nonOrderedPostProcessors = new ArrayList();

for (String postProcessorName : nonOrderedPostProcessorNames) {

// 11.1 获取postProcessorName对应的bean实例, 添加到nonOrderedPostProcessors, 准备执行

nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));

}

// 11.2 遍历nonOrderedPostProcessors, 执行postProcessBeanFactory方法

invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);

// Clear cached merged bean definitions since the post-processors might have

// modified the original metadata, e.g. replacing placeholders in values…

// 12.清除元数据缓存(mergedBeanDefinitions、allBeanNamesByType、singletonBeanNamesByType),

// 因为后处理器可能已经修改了原始元数据,例如, 替换值中的占位符…

beanFactory.clearMetadataCache();

}

1.判断 beanFactory 是否为 BeanDefinitionRegistry。beanFactory 是在之前的 obtainFreshBeanFactory 方法构建的,具体代码在:AbstractRefreshableApplicationContext.refreshBeanFactory() 方法,代码如下。

@Override

protected final void refreshBeanFactory() throws BeansException {

if (hasBeanFactory()) {

destroyBeans();

closeBeanFactory();

}

try {

// 创建一个新的BeanFactory

DefaultListableBeanFactory beanFactory = createBeanFactory();

beanFactory.setSerializationId(getId());

customizeBeanFactory(beanFactory);

loadBeanDefinitions(beanFactory);

synchronized (this.beanFactoryMonitor) {

this.beanFactory = beanFactory;

}

}

catch (IOException ex) {

throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);

}

}

可以看出,我们构建的 beanFactory 是一个 DefaultListableBeanFactory ,而 DefaultListableBeanFactory 实现了BeanDefinitionRegistry 接口,因此 beanFactory instanceof BeanDefinitionRegistry 结果为 true。

3.4 获取 ppName 对应的 bean 实例,添加到 currentRegistryProcessors 中,准备执行。beanFactory.getBean 方法会触发创建 ppName 对应的 bean 实例对象,创建 bean 实例是 IoC 的另一个核心内容,之后会单独解析,目前暂不深入解析。

3.6 进行排序,该方法在下面也被调用了好几次,见代码块3详解。

代码块3:sortPostProcessors


private static void sortPostProcessors(List<?> postProcessors, ConfigurableListableBeanFactory beanFactory) {

Comparator comparatorToUse = null;

if (beanFactory instanceof DefaultListableBeanFactory) {

// 1.获取设置的比较器

comparatorToUse = ((DefaultListableBeanFactory) beanFactory).getDependencyComparator();

}

if (comparatorToUse == null) {

// 2.如果没有设置比较器, 则使用默认的OrderComparator

comparatorToUse = OrderComparator.INSTANCE;

}

// 3.使用比较器对postProcessors进行排序

Collections.sort(postProcessors, comparatorToUse);

}

默认情况下,比较器为 OrderComparator;如果配置了 annotation-config,并且值为true,使用的是 AnnotationAwareOrderComparator( Spring IoC:context:component-scan节点解析 代码块17中设置了dependencyComparator 属性为 AnnotationAwareOrderComparator.INSTANCE),AnnotationAwareOrderComparator 继承自 OrderComparator,只是重写了部分方法,比较器的部分代码如下:

@Override

public int compare(Object o1, Object o2) {

return doCompare(o1, o2, null);

}

private int doCompare(Object o1, Object o2, OrderSourceProvider sourceProvider) {

// 判断o1是否实现了PriorityOrdered接口

boolean p1 = (o1 instanceof PriorityOrdered);

// 判断o2是否实现了PriorityOrdered接口

boolean p2 = (o2 instanceof PriorityOrdered);

// 1.如果o1实现了PriorityOrdered接口, 而o2没有, 则o1排前面

if (p1 && !p2) {

return -1;

}

// 2.如果o2实现了PriorityOrdered接口, 而o1没有, 则o2排前面

else if (p2 && !p1) {

return 1;

}

// 3.如果o1和o2都实现(都没实现)PriorityOrdered接口

// Direct evaluation instead of Integer.compareTo to avoid unnecessary object creation.

// 拿到o1的order值, 如果没实现Ordered接口, 值为Ordered.LOWEST_PRECEDENCE

int i1 = getOrder(o1, sourceProvider);

// 拿到o2的order值, 如果没实现Ordered接口, 值为Ordered.LOWEST_PRECEDENCE

int i2 = getOrder(o2, sourceProvider);

// 4.通过order值(order值越小, 优先级越高)排序

return (i1 < i2) ? -1 : (i1 > i2) ? 1 : 0;

}

比较器的逻辑很简单,实现 PriorityOrdered 接口的优先级最高,如果两个对象都实现(都没实现)PriorityOrdered 接口,则根据 order 值(实现 Ordered 接口时,需要实现 getOrder() 方法,返回 order 值)来进行比较,order 值越小,优先级越高。

基本使用

====

1.BeanDefinitionRegistryPostProcessor 的扩展使用


使用方法比较简单,新建一个类实现 BeanDefinitionRegistryPostProcessor 接口,并将该类注册到 Spring IoC 容器中。

package com.joonwhee.open.demo.spring;

import org.springframework.beans.BeansException;

import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。

开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下互联网工程师必备的面试1000题

注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友

最新“美团+字节+腾讯”一二三面问题,挑战一下你能走到哪一面?

互联网工程师必备的面试1000题

而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题

最新“美团+字节+腾讯”一二三面问题,挑战一下你能走到哪一面?

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
032d36.jpg" alt=“img” style=“zoom: 33%;” />

最后

看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。

开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下互联网工程师必备的面试1000题

注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友

[外链图片转存中…(img-bskZ4V8J-1712195388077)]

互联网工程师必备的面试1000题

而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题

[外链图片转存中…(img-PWolSbYe-1712195388077)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值