BeanFactoryPostProcessor 是beanFactory的后置处理器
在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容
所有的bean定义保存加载到beanFactory,但是bean的实例还未创建
BeanPostProcessor 是bean的后置处理器
基本使用
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
for (String str:beanDefinitionNames){
System.out.println(str);
}
System.out.println("----------------------");
}
}
BeanFactoryPostProcessor 的运行流程和触发时机
1.IOC容器创建 refresh() 容器刷新
AnnotationConfigApplicationContext
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
this();
register(annotatedClasses);
refresh();
}
2.调用beanFactoryPostProcessor 在finishBeanFactoryInitialization(beanFactory); 方法之前调用 因此是在bean初始化之前执行
AnnotationConfigApplicationContext
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
//获取所有的BeanFactoryPostProcessor处理器 进行处理 也具有实现Ordered 进行排序优先执行
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()));
}
}