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接口的方法

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