- BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作
- BeanFactoryPostProcessor:beanFactory的后置处理器,在BeanFactory标准初始化之后调用:所以bean定义信息已经保存加载到beanFactory中,但是bean实例还未创建
测试:
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("MyBeanFactoryPostProcessor...");
int beanDefinitionCount = beanFactory.getBeanDefinitionCount();
String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
System.out.println(Arrays.toString(beanDefinitionNames));
System.out.println(beanDefinitionCount);
}
}
@ComponentScan
@Configuration
public class ExtConfig {
@Bean
public Blue blue(){
return new Blue();
}
}
public class Blue {
public Blue(){
System.out.println("blue construct ...");
}
}
public class MainTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class);
((AnnotationConfigApplicationContext) applicationContext).close();
}
}
原理:在spring容器启动时的refresh方法:有一步invokeBeanFactoryPostProcessors。这一步会执行所有的BeanFactoryPostProcessors
方法invokeBeanFactoryPostProcessors:
方法:invokeBeanFactoryPostProcessors,该方法就是调用BeanFactoryPostProcessor的postProcessBeanFactory方法