扩展原理——BeanDefinitionRegistryPostProcessor

一、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组件执行

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值