和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);
}
}