BeanFactoryPostProcessor的应用和原理

作用(Bean的前置处理器 )

实现该接口,可以在spring的bean创建之前,修改bean的定义属性。也就是说,Spring允许BeanFactoryPostProcessor在容器实例化任何其它bean之前读取配置元数据,并可以根据需要进行修改,例如可以把bean的scope从singleton改为prototype,也可以把property的值给修改掉。可以同时配置多个BeanFactoryPostProcessor,并通过设置’order’属性来控制各个BeanFactoryPostProcessor的执行次序。
注意:BeanFactoryPostProcessor是在spring容器加载了bean的定义文件之后,在bean实例化之前执行的。接口方法的入参是ConfigurrableListableBeanFactory

应用

ioc之后 Bean实例化之前执行

@Component
public class MyBeanFactoryPostProcessor  implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        Demo bean = beanFactory.getBean(Demo.class);
        bean.setId("212121231231");
    }
}

原理

public void refresh() throws BeansException, IllegalStateException {
  ......
  invokeBeanFactoryPostProcessors(beanFactory);
  ......
}
	protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
	 //执行前置处理和BeanIOC的注入
  PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
    ...... 
	}
	public static void invokeBeanFactoryPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
       ......
       此处调用的是实现了 BeanFactoryPostProcessor 接口的类 执行 postProcessBeanFactory 方法
       invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
       ......      
      }
	private static void invokeBeanFactoryPostProcessors(
			Collection<? extends BeanFactoryPostProcessor> postProcessors, ConfigurableListableBeanFactory beanFactory) {
    遍历实现了 BeanFactoryPostProcessor 接口 执行 postProcessBeanFactory
		for (BeanFactoryPostProcessor postProcessor : postProcessors) {
			StartupStep postProcessBeanFactory = beanFactory.getApplicationStartup().start("spring.context.bean-factory.post-process")
					.tag("postProcessor", postProcessor::toString);
			postProcessor.postProcessBeanFactory(beanFactory);
			postProcessBeanFactory.end();
		}
	}

你可能感兴趣的:(spring,spring)