Spring 源码扩展 BeanFactoryPostProcessor 与 BeanDefinitionRegistryPostProcessor 后置处理器

一. BeanFactoryPostProcessor

1. 解释与使用示例

  1. BeanFactoryPostProcessor 是一个接口,与BeanPostProcessor 不同的是
  1. 该接口中有一个 postProcessBeanFactory() 抽象方法
  2. BeanPostProcessor 是 bean 的后置处理器,监控 bean初始化前后,拦截执行 BeanPostProcessor 中的方法
  3. BeanFactoryPostProcessor 可以看为是更上一层的后置处理器,(可以理解为 BeanFactory 的后置处理器)当所有 bean 加载完成放入Beanfactory 后,但是还未创建时执行该接口中的方法
  1. 示例:
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;
/*注意不要忘记将自定义的 BeanFactoryPostProcessor 注入到容器中*/
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    //继承 BeanFactoryPostProcessor 接口,重写接口中的 postProcessBeanFactory() 方法
    //此时在启动Spring容器后,加载所有bean以后,开始创建 bean 以前会先执行该方法,然后在创建容器中的 bean
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        //通过 configurableListableBeanFactory 可以拿到:
        //获取工厂中所有 bean 的名字
        String[] names = configurableListableBeanFactory.getBeanDefinitionNames();
        //获取工厂中存有的所有 bean 的个数
        int beanCount = configurableListableBeanFactory.getBeanDefinitionCount();
        //获取工厂中所有继承了 BeanPostProcessor 的后置处理器个数
        int countProcessor = configurableListableBeanFactory.getBeanPostProcessorCount();
    }
}

2. 运行原理

  1. 在创建 IOC 容器时,会调用 refresh() 方法,在该方法中会调用 invokeBeanFactoryPostProcessors(beanFactory)
    在这里插入图片描述
  2. 在 invokeBeanFactoryPostProcessors(beanFactory) 方法中调用了 invokeBeanFactoryPostProcessors(beanFactory, this.getBeanFactoryPostProcessors())
    在这里插入图片描述
  3. 查看该方法
public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
        Set<String> processedBeans = new HashSet();
        int var9;
        ArrayList priorityOrderedPostProcessors;
        ArrayList orderedPostProcessors;
        if (beanFactory instanceof BeanDefinitionRegistry) {
            BeanDefinitionRegistry registry = (BeanDefinitionRegistry)beanFactory;
            List<BeanFactoryPostProcessor> regularPostProcessors = new LinkedList();
            List<BeanDefinitionRegistryPostProcessor> registryPostProcessors = new LinkedList();
            Iterator var6 = beanFactoryPostProcessors.iterator();

            while(var6.hasNext()) {
                BeanFactoryPostProcessor postProcessor = (BeanFactoryPostProcessor)var6.next();
                if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
                    BeanDefinitionRegistryPostProcessor registryPostProcessor = (BeanDefinitionRegistryPostProcessor)postProcessor;
                    registryPostProcessor.postProcessBeanDefinitionRegistry(registry);
                    registryPostProcessors.add(registryPostProcessor);
                } else {
                    regularPostProcessors.add(postProcessor);
                }
            }

            String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
            priorityOrderedPostProcessors = new ArrayList();
            String[] var22 = postProcessorNames;
            var9 = postProcessorNames.length;

            int var10;
            for(var10 = 0; var10 < var9; ++var10) {
                String ppName = var22[var10];
                if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                    priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                    processedBeans.add(ppName);
                }
            }

            sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
            registryPostProcessors.addAll(priorityOrderedPostProcessors);
            invokeBeanDefinitionRegistryPostProcessors(priorityOrderedPostProcessors, registry);
            postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
            orderedPostProcessors = new ArrayList();
            String[] var26 = postProcessorNames;
            var10 = postProcessorNames.length;

            int var30;
            for(var30 = 0; var30 < var10; ++var30) {
                String ppName = var26[var30];
                if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
                    orderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                    processedBeans.add(ppName);
                }
            }

            sortPostProcessors(beanFactory, orderedPostProcessors);
            registryPostProcessors.addAll(orderedPostProcessors);
            invokeBeanDefinitionRegistryPostProcessors(orderedPostProcessors, registry);
            boolean reiterate = true;

            while(reiterate) {
                reiterate = false;
                postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
                String[] var28 = postProcessorNames;
                var30 = postProcessorNames.length;

                for(int var33 = 0; var33 < var30; ++var33) {
                    String ppName = var28[var33];
                    if (!processedBeans.contains(ppName)) {
                        BeanDefinitionRegistryPostProcessor pp = (BeanDefinitionRegistryPostProcessor)beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class);
                        registryPostProcessors.add(pp);
                        processedBeans.add(ppName);
                        pp.postProcessBeanDefinitionRegistry(registry);
                        reiterate = true;
                    }
                }
            }

            invokeBeanFactoryPostProcessors((Collection)registryPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
            invokeBeanFactoryPostProcessors((Collection)regularPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
        } else {
            invokeBeanFactoryPostProcessors((Collection)beanFactoryPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
        }
		//1.获取 BeanFactory 中所有 BeanFactoryPostProcessor 的 bean 的名字
        String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
        List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList();
        List<String> orderedPostProcessorNames = new ArrayList();
        List<String> nonOrderedPostProcessorNames = new ArrayList();
        String[] var21 = postProcessorNames;
        int var24 = postProcessorNames.length;

        String ppName;
        //2.遍历获取到的 BeanFactoryPostProcessor 名字,对容器中所有 BeanFactoryPostProcessor 进行排序,这样就做到了不同 BeanFactoryPostProcessor 先后执行的顺序不同
        for(var9 = 0; var9 < var24; ++var9) {
            ppName = var21[var9];
            if (!processedBeans.contains(ppName)) {
                if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                    priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
                } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
                    orderedPostProcessorNames.add(ppName);
                } else {
                    nonOrderedPostProcessorNames.add(ppName);
                }
            }
        }

        sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
        invokeBeanFactoryPostProcessors((Collection)priorityOrderedPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
        priorityOrderedPostProcessors = new ArrayList();
        Iterator var25 = orderedPostProcessorNames.iterator();

        while(var25.hasNext()) {
            String postProcessorName = (String)var25.next();
            
            //=========3.使用 beanFactory,通过通过前面获取到的 BeanFactoryPostProcessor 的名字获取bean==================
            priorityOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
            
        }

        sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
        
        //=============4.遍历获执行取到的 BeanFactoryPostProcessor 中的 postProcessBeanFactory() 方法=================
        invokeBeanFactoryPostProcessors((Collection)priorityOrderedPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
        
        orderedPostProcessors = new ArrayList();
        Iterator var32 = nonOrderedPostProcessorNames.iterator();

        while(var32.hasNext()) {
            ppName = (String)var32.next();
            orderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
        }

        invokeBeanFactoryPostProcessors((Collection)orderedPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
        beanFactory.clearMetadataCache();
    }
  1. 查看 invokeBeanFactoryPostProcessors((Collection)priorityOrderedPostProcessors, (ConfigurableListableBeanFactory)beanFactory) 方法

在这里插入图片描述

二. BeanDefinitionRegistryPostProcessor

1. 解释与使用示例

  1. 定义注册中心的后置处理器,该接口是 BeanFactoryPostProcessor 的一个子接口,与 BeanFactoryPostProcessor 不同的是

  2. 与 BeanFactoryPostProcessor 的区别

  1. 该接口中增加了一个 postProcessBeanDefinitionRegistry() 抽象方法,该方法在所有 bean 定义信息将要被加载,加载前执行
  2. 执行顺序早于 BeanFactoryPostProcessor , 与 BeanFactoryPostProcessor中的postProcessBeanFactory()方法都是在 refresh() 中invokeBeanFactoryPostProcessors(beanFactory) 被调用的,在加载所有 bean 以前,首先获取执行 BeanDefinitionRegistryPostProcessor 中的 postProcessBeanDefinitionRegistry() 方法,然后执行该接口中的 postProcessBeanFactory() 方法,然后才是 BeanFactoryPostProcessor 中的 postProcessBeanFactory() 方法
  1. 使用示例
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.*;
import org.springframework.stereotype.Component;
//不要忘记注入到容器中
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    /**
     * 容器中所有 bean 加载前要执行的方法
     * BeanDefinitionRegistry 所有 bean 定义信息的存储中心,
     * IOC 容器通过 BeanFactory 创建所有 bean,
     * 而BeanFactory 是按照这个对象中保存的 bean 的信息去加载创建的
     * 通过这个对象可以获取到容器中将要加载创建的所有bean
     * 并且可以通过这个对象,手动的删除,添加,设置这些将要被加载注册的bean
     */
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
        //获取要加载创建的 bean 的个数
        int count = beanDefinitionRegistry.getBeanDefinitionCount();
        //手动添加要向容器中创建注入的bean,例如手动注入自定义的Person
        //第一个String参数是手动添加的bean 的名字
        //第二个,需要一个包含了要添加的bean 的类型的 RootBeanDefinition 对象
        RootBeanDefinition definition = new RootBeanDefinition(Person.class);
        //第二个参数的方式二: 通过构建器
        //AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Person.class).getBeanDefinition();
        beanDefinitionRegistry.registerBeanDefinition("", definition);
        //手动删除要加载注入到容器中的bean
        beanDefinitionRegistry.removeBeanDefinition("Person");
    }

    //容器中所有 bean 加载后 要执行的方法
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {

    }
}

2. 执行原理

  1. 在创建 IOC 容器时,会调用 refresh() 方法,与执行 BeanFactoryPostProcessor 中的 postProcessBeanFactory() 方法是同一个路口,查看上面 "BeanFactoryPostProcessor 运行原理 "中的第3步,在postProcessBeanFactory方法执行前先获取 BeanDefinitionRegistryPostProcessor 会先调用执行 postProcessBeanDefinitionRegistry() 方法
public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
        Set<String> processedBeans = new HashSet();
        int var9;
        ArrayList priorityOrderedPostProcessors;
        ArrayList orderedPostProcessors;
        if (beanFactory instanceof BeanDefinitionRegistry) {
            BeanDefinitionRegistry registry = (BeanDefinitionRegistry)beanFactory;
            List<BeanFactoryPostProcessor> regularPostProcessors = new LinkedList();
            List<BeanDefinitionRegistryPostProcessor> registryPostProcessors = new LinkedList();
            Iterator var6 = beanFactoryPostProcessors.iterator();

            while(var6.hasNext()) {
                BeanFactoryPostProcessor postProcessor = (BeanFactoryPostProcessor)var6.next();
                if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
                    BeanDefinitionRegistryPostProcessor registryPostProcessor = (BeanDefinitionRegistryPostProcessor)postProcessor;
                    registryPostProcessor.postProcessBeanDefinitionRegistry(registry);
                    registryPostProcessors.add(registryPostProcessor);
                } else {
                    regularPostProcessors.add(postProcessor);
                }
            }
            String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
            priorityOrderedPostProcessors = new ArrayList();
            String[] var22 = postProcessorNames;
            var9 = postProcessorNames.length;

            int var10;
            for(var10 = 0; var10 < var9; ++var10) {
                String ppName = var22[var10];
                if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                    priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                    processedBeans.add(ppName);
                }
            }

            sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
            registryPostProcessors.addAll(priorityOrderedPostProcessors);
            invokeBeanDefinitionRegistryPostProcessors(priorityOrderedPostProcessors, registry);
            postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
            orderedPostProcessors = new ArrayList();
            String[] var26 = postProcessorNames;
            var10 = postProcessorNames.length;
            int var30;
            for(var30 = 0; var30 < var10; ++var30) {
                String ppName = var26[var30];
                if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
                    orderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                    processedBeans.add(ppName);
                }
            }

            sortPostProcessors(beanFactory, orderedPostProcessors);
            registryPostProcessors.addAll(orderedPostProcessors);
            invokeBeanDefinitionRegistryPostProcessors(orderedPostProcessors, registry);
            boolean reiterate = true;

            while(reiterate) {
                reiterate = false;
                //1.获取容器中所有 BeanDefinitionRegistryPostProcessor 的名字
                postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
                String[] var28 = postProcessorNames;
                var30 = postProcessorNames.length;
                //遍历执行方法
                for(int var33 = 0; var33 < var30; ++var33) {
                    String ppName = var28[var33];
                    if (!processedBeans.contains(ppName)) {
                        BeanDefinitionRegistryPostProcessor pp = (BeanDefinitionRegistryPostProcessor)beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class);
                        registryPostProcessors.add(pp);
                        processedBeans.add(ppName);
                        //2.执行获取到的 BeanDefinitionRegistryPostProcessors 中的 postProcessBeanDefinitionRegistry() 方法
                        pp.postProcessBeanDefinitionRegistry(registry);
                        reiterate = true;
                    }
                }
            }
			//3.执行 BeanDefinitionRegistryPostProcessors 中的 postProcessBeanFactory() 方法
            invokeBeanFactoryPostProcessors((Collection)registryPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
            invokeBeanFactoryPostProcessors((Collection)regularPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
        } else {
            invokeBeanFactoryPostProcessors((Collection)beanFactoryPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
        }
		//1.获取 BeanFactory 中所有 BeanFactoryPostProcessor 的 bean 的名字
        String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
        List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList();
        List<String> orderedPostProcessorNames = new ArrayList();
        List<String> nonOrderedPostProcessorNames = new ArrayList();
        String[] var21 = postProcessorNames;
        int var24 = postProcessorNames.length;

        String ppName;
        //2.遍历获取到的 BeanFactoryPostProcessor 名字,对容器中所有 BeanFactoryPostProcessor 进行排序,这样就做到了不同 BeanFactoryPostProcessor 先后执行的顺序不同
        for(var9 = 0; var9 < var24; ++var9) {
            ppName = var21[var9];
            if (!processedBeans.contains(ppName)) {
                if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                    priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
                } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
                    orderedPostProcessorNames.add(ppName);
                } else {
                    nonOrderedPostProcessorNames.add(ppName);
                }
            }
        }

        sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
        invokeBeanFactoryPostProcessors((Collection)priorityOrderedPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
        priorityOrderedPostProcessors = new ArrayList();
        Iterator var25 = orderedPostProcessorNames.iterator();

        while(var25.hasNext()) {
            String postProcessorName = (String)var25.next();
            
            //=========3.使用 beanFactory,通过通过前面获取到的 BeanFactoryPostProcessor 的名字获取bean==================
            priorityOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
            
        }

        sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
        
        //=============4.遍历执行取到的 BeanFactoryPostProcessor 中的 postProcessBeanFactory() 方法=================
        invokeBeanFactoryPostProcessors((Collection)priorityOrderedPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
        
        orderedPostProcessors = new ArrayList();
        Iterator var32 = nonOrderedPostProcessorNames.iterator();

        while(var32.hasNext()) {
            ppName = (String)var32.next();
            orderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
        }

        invokeBeanFactoryPostProcessors((Collection)orderedPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
        beanFactory.clearMetadataCache();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值