扩展原理——BeanDefinitionRegistryPostProcessor

  • Post author:
  • Post category:其他




一、

BeanDefinitionRegistryPostProcessor

后置处理器


BeanDefinitionRegistryPostProcessor

接口继承

BeanFactoryPostProcessor

接口,在所有bean定义信息

将要被加载

,bean实例还没有创建的时候执行。

BeanDefinitionRegistry

是bean定义信息的

保存中心

,以后

BeanFactory

就是按照

BeanDefinitionRegistry

里面保存的每一个bean定义信息

创建

bean实例

在这里插入图片描述


BeanDefinitionRegistryPostProcessor

会在

BeanFactoryPostProcessor

之前执行,可以利用

BeanDefinitionRegistryPostProcessor

给容器中添加一些其它组件

自定义

MyBeanDefinitionRegistryPostProcessor

组件,实现

BeanDefinitionRegistryPostProcessor

接口

@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {

        System.out.println("MyBeanDefinitionRegistryPostProcessor...postProcessBeanDefinitionRegistry方法 " +
                "Bean的数量:" + registry.getBeanDefinitionCount());

        //手动注册一些bean定义信息
        RootBeanDefinition beanDefinition = new RootBeanDefinition(Girl.class);
        registry.registerBeanDefinition("helloGirl",beanDefinition);

        AbstractBeanDefinition beanDefinition1 = BeanDefinitionBuilder.rootBeanDefinition(Girl.class).getBeanDefinition();
        registry.registerBeanDefinition("byeGirl",beanDefinition1);
    }

    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

        System.out.println("MyBeanDefinitionRegistryPostProcessor...postProcessBeanFactory方法 " +
                "Bean的数量:" + beanFactory.getBeanDefinitionCount());

    }
}

测试

在这里插入图片描述



二、

BeanDefinitionRegistryPostProcessor

优先执行原理

首先是准备创建ioc容器

在这里插入图片描述

调用

refresh()

刷新容器

在这里插入图片描述


refresh()

方法会调用

invokeBeanFactoryPostProcessors(beanFactory)

方法

在这里插入图片描述


invokeBeanFactoryPostProcessors(beanFactory)

方法会从容器中获取到所有的

BeanDefinitionRegistryPostProcessor

组件,然后调用

invokeBeanDefinitionRegistryPostProcessors()

方法

在这里插入图片描述

遍历每一个

BeanDefinitionRegistryPostProcessor

组件,触发

postProcessBeanDefinitionRegistry()

方法

在这里插入图片描述

执行自定义的

postProcessBeanDefinitionRegistry()

方法

在这里插入图片描述

执行完

invokeBeanDefinitionRegistryPostProcessors()

方法之后,会继续调用

invokeBeanFactoryPostProcessors()

方法

在这里插入图片描述

遍历每一个

BeanDefinitionRegistryPostProcessor

组件,触发

postProcessBeanFactory()

方法,这个方法是

BeanFactoryPostProcessor

规定的方法,但是

BeanDefinitionRegistryPostProcessor

接口继承了

BeanFactoryPostProcessor

接口,重写了该方法

在这里插入图片描述

执行自定义的

postProcessBeanFactory()

方法

在这里插入图片描述

至此,

BeanDefinitionRegistryPostProcessor

的两个方法都执行完成,即

BeanDefinitionRegistryPostProcessor

组件执行完毕。

接下来会从容器中找到

BeanFactoryPostProcessor

组件,依次触发

postProcessBeanFactory()

方法,由于

BeanDefinitionRegistryPostProcessor

组件优先

BeanFactoryPostProcessor

组件执行,所以

BeanDefinitionRegistryPostProcessor

组件继承的

postProcessBeanFactory()

方法也会优先于

BeanFactoryPostProcessor

组件里面的

postProcessBeanFactory()

方法

在这里插入图片描述

所以,

BeanDefinitionRegistryPostProcessor

组件优先

BeanFactoryPostProcessor

组件执行



版权声明:本文为qq_39794062原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。