Spring:BeanFactoryPostProcessor原理

  • 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();

    }
}

image-20210316090745028

原理:在spring容器启动时的refresh方法:有一步invokeBeanFactoryPostProcessors。这一步会执行所有的BeanFactoryPostProcessors

image-20210316092442603

image-20210316091214471

方法invokeBeanFactoryPostProcessors:

image-20210316091840647

image-20210316091631786

方法:invokeBeanFactoryPostProcessors,该方法就是调用BeanFactoryPostProcessor的postProcessBeanFactory方法

image-20210316091950727

原文地址:https://www.cnblogs.com/wwjj4811/p/14541579.html