AbstractApplicationContext提供的postProcessBeanFactory空方法
postProcessBeanFactory这个方法没名字跟BeanFactoryPostProcessor接口中的方法一样,但是他的功能是提供给子类进行添加一些额外的功能,比如添加BeanPostProcessor接口的实现,或者定制一些其他的功能也是可以的,因为这个方法你可以拿到BeanFactory,自然是可以对他进行一些功能的定制的。
这里看下Spring 提供的子类 GenericWebApplicationContext
是如何实现的:
@Override protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { if (this.servletContext != null) { beanFactory.addBeanPostProcessor(new ServletContextAwareProcessor(this.servletContext)); beanFactory.ignoreDependencyInterface(ServletContextAware.class); } WebApplicationContextUtils.registerWebApplicationScopes(beanFactory, this.servletContext); WebApplicationContextUtils.registerEnvironmentBeans(beanFactory, this.servletContext); }
这里他注册了一个 ServletContextAwreProcessor
到 beanFactory
中, ServletContexAwareProcessor
是一个 BeanPostProcessor
接口的子类。
重头戏BeanFactoryPostProcessor
接下来分析 AbstractApplicationContext#refresh
中的 invokeBeanFactoryPostProcessors
方法,这个方法用来注册和执行 BeanFactoryPostProcessor
的。
直接上源码:
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { // 执行所有的BeanFactoryPostProcessor 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) // aop的处理 if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) { beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory)); beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader())); } }
重点在这里:
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
首先获取 BeanFactoryPostProcessor
的集合,这里获取到都是用户在定制 BeanFactory
时 add
加入进去的,进入这个方法:
public static void invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) { // Invoke BeanDefinitionRegistryPostProcessors first, if any. // 已经处理的Bean Set<String> processedBeans = new HashSet<>(); // 先进性外部BFPP的处理,并且判断当前Factory是否是BeanDefinitionRegistry if (beanFactory instanceof BeanDefinitionRegistry) { BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; // 保存BFPP的Bean List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>(); // 保存BDRPP的Bean List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>(); // 开始处理外部传入的BFPP for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) { // 先处理BDRPP if (postProcessor instan