在前边的两篇内容中,我们了解到了BeanDefinition的相关知识,以及创建BeanDefinition以后,通过BeanFactoryPostProcessor接口对BeanDefinition的定制化修改操作。
BeanDefinition加载与定制化修改完成以后,接下来要做什么呢?是不是马上就要开始创建Bean了呢?
BeanPostProcessors的实例化
spring在开始创建用户自定义Bean之前,还做了对BeanPostProcessor接口实现类的实例化。这个接口BeanFactoryPostProcessor接口在名称上很相似又有不同,从名称上大家就可以很容易的区分,BeanFactoryPostProcessor接口主要是针对BeanFactory的后置处理,而BeanPostProcessor接口则是针对Bean的处理。具体就是调用如下方法实现的:
public static void registerBeanPostProcessors(
ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
...
// 首先将实现了PriorityOrdered的 BeanPostProcessors进行注册
// 接下来注册实现了 Ordered的BeanPostProcessors
List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
for (String ppName : orderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
orderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
sortPostProcessors(orderedPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, orderedPostProcessors);
// 最后注册普通的BeanPostProcessors。我们自定义的一般在这个地方进行注册
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
for (String ppName : nonOrderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);// 注册的BeanPostProcessor 的时机
nonOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
// Finally, re-register all internal BeanPostProcessors.
sortPostProcessors(internalPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, internalPostProcessors);
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}
BeanPostProcessor的实例化细节
spring将所有的BeanPostProcessor进行了归类,按照加载顺序使用 PriorityOrdered,Ordered和普通优先级的BeanPostProcessor之间分开。
我们用户自己通过实现BeanPostProcessor接口而创建的类归为第三类。在方法中表示为nonOrderedPostProcessors。可以看出,它的实现步骤在三者中的最后。
这里仅仅是创建这些类的实例,并没有对接口内方法进行调用。
他们的方法调用发生在什么时候呢?
首先贴出BeanPostProcessor接口的源码:
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;
}
他们的调用时机从方法名上就能清晰的了解到,在用户自定义Bean的 init方法执行之前,调用前置方法 postProcessBeforeInitialization();在用户自定义Bean 的Init方法调用之后,执行 postProcessAfterInitialization()方法。这两个方法的调用将会在后续的文章中做详细的介绍。