1.BeanFactoryPostProcessor
BeanFactoryPostProcessor:beanFactory的后置处理器。
作用如下:
- a)在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容;
- b)所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建
注意:之前也讲过BeanPostProcessor,它是bean后置处理器,bean创建对象初始化前后进行拦截工作的
@Component
public class JamesBeanFactoryPostProcessor implements BeanFactoryPostProcessor{
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("JamesBeanFactoryPostProcessor.....调用了BeanFactoryPostProcessor.postProcessBeanFactory()");
//所有bean的定义,已经加载到beanFactory, 但是bean实例还没创建
int count = beanFactory.getBeanDefinitionCount();
String[] beanDefName = beanFactory.getBeanDefinitionNames();
System.out.println("当前BeanFactory中有"+count+"个Bean");
System.out.println(Arrays.asList(beanDefName));
}
}
结果:
JamesBeanFactoryPostProcessor.....调到了BeanFactoryPostProcessor.postProcessBeanFactory()
当前BeanFactory中有11个Bean
[org.springframework.context.annotation.internalConfigurationAnnotationProcessor, org.springframework.context.annotation.internalAutowiredAnnotationProcessor, org.springframework.context.annotation.internalRequiredAnnotationProcessor, org.springframework.context.annotation.internalCommonAnnotationProcessor, org.springframework.context.event.internalEventListenerProcessor, org.springframework.context.event.internalEventListenerFactory, ch12MainConfig, jamesBeanDefinitionRegistryPostProcessor, jamesBeanFactoryPostProcessor, getMoon, hello]
Moon constructor........
-
调用时机(调用栈)
2.BeanDefinitionRegistryPostProcessor
@Component
public class JamesBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("JamesBeanDefinitionProcessor..postProcessBeanFactory(),Bean的数量"+beanFactory.getBeanDefinitionCount());
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
System.out.println("amesBeanDefinition.postProcessBeanDefinitionRegistry()...bean的数量"+registry.getBeanDefinitionCount());
//RootBeanDefinition rbd = new RootBeanDefinition(Moon.class);
AbstractBeanDefinition rbd = BeanDefinitionBuilder.rootBeanDefinition(Moon.class).getBeanDefinition();
registry.registerBeanDefinition("hello", rbd);
}
}
结果:
amesBeanDefinition.postProcessBeanDefinitionRegistry()...bean的数量10
JamesBeanDefinitionProcessor..postProcessBeanFactory(),Bean的数量11
Moon constructor........
调用栈为:
3.总结
先执行BeanDefinitionRegistryPostProcessor的处理器,而BeanFactoryPostProcessor的处理器在它后面执行。
参考
- 1)享学课堂James老师笔记