Spring启动invokeBeanFactoryPostProcessors方法解释

编程

BeanFactoryPostProcessor 接口是 Spring 初始化 BeanFactory 时对外暴露的扩展点,Spring IoC 容器允许 BeanFactoryPostProcessor 在容器实例化任何 bean 之前读取 bean 的定义,并可以修改它。

BeanDefinitionRegistryPostProcessor 继承自 BeanFactoryPostProcessor,比 BeanFactoryPostProcessor 具有更高的优先级,主要用来在常规的 BeanFactoryPostProcessor 检测开始之前注册其他 bean 定义。特别是,你可以通过 BeanDefinitionRegistryPostProcessor 来注册一些常规的 BeanFactoryPostProcessor,因为此时所有常规的 BeanFactoryPostProcessor 都还没开始被处理。

项目中的实战

BeanDefinitionRegistryPostProcessor初始化Bean的例子

// 想根据配置文件来动态的生成我们的Bean对象

public class MultiOssScannerConfigurer implements BeanDefinitionRegistryPostProcessor, InitializingBean, ApplicationContextAware, BeanNameAware {

@Setter

private MultiOssProperties multiOssProperties;

@Override

public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {

String beanSuffixName = StringUtils.capitalize(OssConstants.BEAN_SUFFIX_NAME);

multiOssProperties.getClients().forEach((productCode, ossProperties) -> {

AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(OssClient.class,

() -> OssClientUtils.buildOssClient(ossProperties))

.getRawBeanDefinition();

beanDefinition.setInitMethodName("init");

beanDefinition.setDestroyMethodName("shutDown");

beanDefinitionRegistry.registerBeanDefinition(productCode + beanSuffixName, beanDefinition);

});

}

}

BeanFactoryPostProcessor初始化的时候do something

public class KeplerBeanFactoryPostInitializer implements BeanFactoryPostProcessor {

@Override

public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

Map<String, AviatorFunction> aviatorFunctionMap = beanFactory.getBeansOfType(AviatorFunction.class);

if (aviatorFunctionMap.size() > 0) {

log.info("初始化自定义RuleLoader...");

aviatorFunctionMap.forEach((k, v) -> {

log.info("加载Rule:{}", k);

AviatorEvaluator.addFunction(v);

});

}

RuleLoader.initRule();

}

}

跟进源代码

protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {

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

}

}

getBeanFactoryPostProcessors

/**

* Return the list of BeanFactoryPostProcessors that will get applied

* to the internal BeanFactory.

*/

public List<BeanFactoryPostProcessor> getBeanFactoryPostProcessors() {

return this.beanFactoryPostProcessors;

}

这边 getBeanFactoryPostProcessors() 会拿到当前应用上下文中已经注册的 BeanFactoryPostProcessor,在默认情况下,this.beanFactoryPostProcessors 是返回空的。

public interface ApplicationContextInitializer<C extends ConfigurableApplicationContext> {

/**

* Initialize the given application context.

* @param applicationContext the application to configure

*/

void initialize(C applicationContext);

}

invokeBeanFactoryPostProcessors

public static void invokeBeanFactoryPostProcessors(

ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {

// Invoke BeanDefinitionRegistryPostProcessors first, if any.

Set<String> processedBeans = new HashSet<String>();

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

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

if (beanFactory instanceof BeanDefinitionRegistry) {

BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;

// 用于存放普通的BeanFactoryPostProcessor

List<BeanFactoryPostProcessor> regularPostProcessors = new LinkedList<BeanFactoryPostProcessor>();

// 用于存放BeanDefinitionRegistryPostProcessor

List<BeanDefinitionRegistryPostProcessor> registryProcessors = new LinkedList<BeanDefinitionRegistryPostProcessor>();

// 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<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<BeanDefinitionRegistryPostProcessor>();

// 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<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();

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

List<String> orderedPostProcessorNames = new ArrayList<String>();

// 用于存放普通BeanFactoryPostProcessor的beanName

List<String> nonOrderedPostProcessorNames = new ArrayList<String>();

// 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<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();

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<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();

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

}

sortPostProcessors

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

Comparator<Object> 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,使用的是 AnnotationAwareOrderComparatorAnnotationAwareOrderComparator 继承自 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;

}

总结

第一点:整个 invokeBeanFactoryPostProcessors 方法围绕两个接口,BeanDefinitionRegistryPostProcessorBeanFactoryPostProcessor,其中 BeanDefinitionRegistryPostProcessor 继承了 BeanFactoryPostProcessorBeanDefinitionRegistryPostProcessor 主要用来在常规 BeanFactoryPostProcessor 检测开始之前注册其他 Bean 定义,说的简单点,就是 BeanDefinitionRegistryPostProcessor 具有更高的优先级,执行顺序在 BeanFactoryPostProcessor 之前。

第二点:整个 invokeBeanFactoryPostProcessors 方法操作了 3 种 bean 对象:

  • 入参 beanFactoryPostProcessors:拿的是 AbstractApplicationContext 类的 beanFactoryPostProcessors 属性值,也就是在之前已经添加到 beanFactoryPostProcessors 中的 BeanFactoryPostProcessor
  • BeanDefinitionRegistryPostProcessor 接口实现类:实现了 BeanDefinitionRegistryPostProcessor 接口,并且注册到 Spring IoC容器中。
  • 常规 BeanFactoryPostProcessor 接口实现类:实现了 BeanFactoryPostProcessor 接口,并且注册到 Spring IoC容器中。

第三点:操作3种 bean 对象具体指的是调用它们重写的方法,调用实现方法时会遵循以下的优先级:

两个用于排序的重要接口:PriorityOrderedOrdered,其中 PriorityOrdered 继承了 Ordered,并且 PriorityOrdered 的优先级要高于 Ordered,这跟 BeanDefinitionRegistryPostProcessor 继承 BeanFactoryPostProcessor 有点类似。实现 Ordered 接口需要重写 getOrder 方法,返回一个用于排序的 order 值,order 值的范围为 Integer.MIN_VALUE ~ Integer.MAX_VALUEorder 值越小优先级越高,Integer.MIN_VALUE 拥有最高优先级,而 Integer.MAX_VALUE 则对应的拥有最低优先级。

第四点:常见的 Java EE 相关的框架或者中间件,经常使用 BeanFactoryPostProcessor 来进行扩展,例如上面的 Mybatis,因此了解 BeanFactoryPostProcessor 的原理会对之后理解其他中间件的原理有帮助。

参考地址

  • https://blog.csdn.net/v123411739/article/details/87741251

如果大家喜欢我的文章,可以关注个人订阅号。欢迎随时留言、交流。如果想加入微信群的话一起讨论的话,请加管理员简栈文化-小助手(lastpass4u),他会拉你们进群。

以上是 Spring启动invokeBeanFactoryPostProcessors方法解释 的全部内容, 来源链接: utcz.com/z/515093.html

回到顶部