接着上一篇文章继续分析:

1、postProcessBeanFactory(beanFactory)

在应用程序上下文的标准初始化之后修改其内部bean工厂。所有bean定义都已加载,但还没有实例化bean。这允许在特定的ApplicationContext实现中注册特殊的BeanPostProcessors等。

1
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {}

由子类实现:
postProcessBeanFactory方法实现者.png

2、invokeBeanFactoryPostProcessors(beanFactory)

实例化并调用所有已注册的BeanFactoryPostProcessor bean,如果给定显式顺序,则遵循显式顺序。必须在单例实例化之前调用。

1
2
3
4
5
6
7
8
9
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
// 检测LoadTimeWeaver并准备编织,如果同时发现
// (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()));
}
}

3、registerBeanPostProcessors(beanFactory)

实例化并注册所有BeanPostProcessor bean,如果给定则遵循显式顺序。必须在单例实例化之前调用。

1
2
3
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
}

以上两个方法都调用了类PostProcessorRegistrationDelegate中的方法。

4、PostProcessorRegistrationDelegate

委托AbstractApplicationContext的后处理器处理。
分为两个主要功能:

  1. 执行BeanFactoryPostProcessor-BeanDefinition的容器级别的后处理器
  2. 注册BeanPostProcessor-getBean操作获得的对象的后处理器

看一下BeanFactoryPostProcessor与BeanPostProcessor的接口定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@FunctionalInterface
public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
public interface BeanPostProcessor {
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}

可以看出BeanFactoryPostProcessor只有一个后置处理,而BeanPostProcessor由前置和后置处理。
BeanFactoryPostProcessor是用于处理BeanDefinition,BeanPostProcessor用于处理bean实例。
BeanFactoryPostProcessor在refresh()方法中被调用,BeanPostProcessor是在获取bean实例的时候调用。

tencent.jpg