一、基本概念
- BeanPostProcessor:bean后置处理器,bean创建对象初始化后进行拦截工作的
- BeanFactoryPostProcessor:beanFactory的后置处理器。
- 在BeanFactory标准初始化之后调用,所有的bean定义已经保存加载到beanFactory中,但是bean的实例还未创建。可以用来定制和修改BeanFactory的内容
二、验证代码
- 可以创建了一个对象Blue,验证是否是再BeanFactoryPostProcessor之后,进行初始化
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("MyBeanFactoryPostProcessor....postProcessBeanFactory...");
int beanDefinitionCount = beanFactory.getBeanDefinitionCount();
String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
System.out.println("容器中的bean的个数"+beanDefinitionCount);
Arrays.stream(beanDefinitionNames).forEach(str ->{
System.out.println(str);
});
}
}
- 结果解析
- BeanFactoryPostProcessor日志打印,以及Blue的BeanDefinition的打印
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a37d656277903712879cf645eea26cdf.png)
- 然后是Blue的构造方法打印出的信息
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c91fbc52433ff28d2a737bbf875979b8.png)
三、 源码
- IOC容器创建对象
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/148fbeaf400bc4c018b0cb21908d77e9.png)
- invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessors
- 如何找到所有的BeanFactoryPostProcessor,上面方法中的部分代码
invokeBeanFactoryPostProcessors(beanFactory){
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
List<String> orderedPostProcessorNames = new ArrayList<>();
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
for (String ppName : postProcessorNames) {
if (processedBeans.contains(ppName)) {
}
else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
}
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}
else {
nonOrderedPostProcessorNames.add(ppName);
}
}
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();
for (String postProcessorName : orderedPostProcessorNames) {
orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
sortPostProcessors(orderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
for (String postProcessorName : nonOrderedPostProcessorNames) {
nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
beanFactory.clearMetadataCache();
}
- 直接在BeanFactory中找到所有类型是BeanFactoryPostProcessor的组件,并执行他们的方法。
private static void invokeBeanFactoryPostProcessors(
Collection<? extends BeanFactoryPostProcessor> postProcessors, ConfigurableListableBeanFactory beanFactory) {
for (BeanFactoryPostProcessor postProcessor : postProcessors) {
postProcessor.postProcessBeanFactory(beanFactory);
}
}
- BeanFactoryPostProcessors的执行时机是在初始化创建其他组件前面执行。