• Spring:BeanDefinitionRegistryPostProcessor原理


    接上一篇博客:https://www.cnblogs.com/wwjj4811/p/14541579.html

    BeanFactoryPostProcessor接口下有一个子接口BeanDefinitionRegistryPostProcessor。

    public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
    
    	/**
    	 * Modify the application context's internal bean definition registry after its
    	 * standard initialization. All regular bean definitions will have been loaded,
    	 * but no beans will have been instantiated yet. This allows for adding further
    	 * bean definitions before the next post-processing phase kicks in.
    	 * @param registry the bean definition registry used by the application context
    	 * @throws org.springframework.beans.BeansException in case of errors
    	 */
    	void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
    
    }
    

    根据英文注释,不难理解此接口的方法在所有bean定义信息将要被加载,bean实例还未创建的时候调用。

    所以BeanDefinitionRegistryPostProcessor的方法调用还要在BeanFactoryPostProcessor调用之前,因为BeanFactoryPostProcessor调用时机在所有bean定义已经保存加载到beanFactory了。

    测试:

    @Component
    public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor
    {
        //BeanDefinitionRegistry:bean定义信息的保存中心
        //以后beanFactory就是按照BeanDefinitionRegistry里面保存的bean定义信息创建bean实例
        @Override
        public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
            System.out.println("MyBeanDefinitionRegistryPostProcessor postProcessBeanDefinitionRegistry");
            System.out.println(registry.getBeanDefinitionCount());
            AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Blue.class).getBeanDefinition();
            registry.registerBeanDefinition("hello", beanDefinition);
        }
    
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
            System.out.println("MyBeanDefinitionRegistryPostProcessor postProcessBeanFactory");
            System.out.println(beanFactory.getBeanDefinitionCount());
        }
    }
    
    @ComponentScan
    @Configuration
    public class ExtConfig {
    
    }
    
    public class MainTest {
        public static void main(String[] args) {
    
            ApplicationContext applicationContext  = new AnnotationConfigApplicationContext(ExtConfig.class);
            ((AnnotationConfigApplicationContext) applicationContext).close();
        }
    }
    

    image-20210316093846954

    BeanDefinitionRegistryPostProcessor优先与BeanFactoryPostProcessor执行,所以我们可以利用BeanDefinitionRegistryPostProcessor该容器中额外添加一些组件

    原理:

    大致流程与BeanFactoryPostProcessor相同:

    image-20210316094918331

    最后再调用其他的BeanDefinitionRegistryPostProcessor

    image-20210316094946620

    后面紧接着就会调用BeanFactoryPostProcessor接口的方法

  • 相关阅读:
    Linux命令之du命令
    6562. 【GDOI2020模拟4.15】楼房搭建(building)
    CF660E. Different Subsets For All Tuples
    6555. 【GDOI2020模拟4.11】黑红兔(brr)(SAM小技♂巧)
    6554. 【GDOI2020模拟4.11】赢家(winner)
    6553. 【GDOI2020模拟4.11】人生(life)
    6546. 【GDOI2020模拟4.8】USACO 2020 Open Contest, Platinum(circus)
    6545. 【GDOI2020模拟4.8】USACO 2020 Open Contest, Platinum(exercise)
    6544. 【USACO 2020 US Open Platinum】 Sprinklers 2: Return of the Alfalfa
    6543. 【GDOI2020模拟4.4】Easy Data Structure(动态dp)
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/14541756.html
Copyright © 2020-2023  润新知