和BeanPostProcessor原理一致,Spring提供了对BeanFactory进行操作的处理器BeanFactoryProcessor,简单来说就是获取容器BeanFactory,这样就可以在真正初始化bean之前对bean做一些处理操作。
BeanFactoryPostProcessor接口源码:
public interface BeanFactoryPostProcessor {
//获取beanFactory,这样在真正使用容器之前可以对一些bean做一些初始化操作
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
 简单示例:
 
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor{
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
//获取BeanDefinition
GenericBeanDefinition rootBeanDefinition = (GenericBeanDefinition) beanFactory.getBeanDefinition("transaction");
//将bean设置出延迟初始化
rootBeanDefinition.setLazyInit(true);
System.err.println(rootBeanDefinition.getInitMethodName());
}
}
 
示例的功能是在bean初始化之前修改bean的属性配置。
 
接下来我们介绍一下BeanFactoryPostProcessor的初始化和调用机制。
 
(1)BeanFactoryPostProcessor和普通的bean一样注册到spring容器中。
 
(2)获取所有的BeanFactoryPostProcessor类型的类并初始化,添加到列表中
 
(3)在列表中循环执行所有的BeanFactoryPostProcessor实现类。
 
 
起始执行点在AbstractApplicationContext中,invokeBeanFactoryPostProcessors(beanFactory)执行是在初始化Bean实体方法finishBeanFactoryInitialization(beanFactory)之前,这样就可以在初始化bean之前可以对一些bean做一些额外的处理操作。
 
invokeBeanFactoryPostProcessors(beanFactory);
  执行
  BeanFactoryPostProcessor所有的实现类
  
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
//执行BeanFactoryPostProcessor所有的实现类
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()));
}
}
  PostProcessorRegistrationDelegate类的
  invokeBeanFactoryPostProcessors方法中如下操作
 
获取所有BeanFactoryPostProcessor的子类
 
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
  从Spring的容器中获取所有的
  BeanFactoryPostProcessor实现类,添加到priorityOrderedPostProcessors 中
  
List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
List<String> orderedPostProcessorNames = new ArrayList<String>();
List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
for (String ppName : postProcessorNames) {
if (processedBeans.contains(ppName)) {
// skip - already processed in first phase above
}
else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
//从Spring的容器中获取所有的BeanFactoryPostProcessor实现类,添加到priorityOrderedPostProcessors 中
priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
}
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}
else {
nonOrderedPostProcessorNames.add(ppName);
}
}
  执行所有的
  BeanFactoryPostProcessor的实现类
  
invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
遍历执行所有的BeanFactoryPostProcessor的实现类
  
private static void invokeBeanFactoryPostProcessors(
Collection<? extends BeanFactoryPostProcessor> postProcessors, ConfigurableListableBeanFactory beanFactory) {
for (BeanFactoryPostProcessor postProcessor : postProcessors) {
postProcessor.postProcessBeanFactory(beanFactory);
}
}
  
 
 
 










