Spring中處理Bean后置處理器BeanPostProcessor順序以及流程


執行順序

  1. 執行通過ApplicationContext添加進來的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry()方法
  2. 執行BeanFactory中實現了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry()方法
  3. 執行BeanFactory中實現了Ordered接口的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry()方法
  4. 執行BeanFactory中其他的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry()方法
  5. 執行上面所有的BeanDefinitionRegistryPostProcessor的postProcessBeanFactory()方法
  6. 執行通過ApplicationContext添加進來的BeanFactoryPostProcessor的postProcessBeanFactory()方法
  7. 執行BeanFactory中實現了PriorityOrdered接口的BeanFactoryPostProcessor的postProcessBeanFactory()方法
  8. 執行BeanFactory中實現了Ordered接口的BeanFactoryPostProcessor的postProcessBeanFactory()方法
  9. 執行BeanFactory中其他的BeanFactoryPostProcessor的postProcessBeanFactory()方法

簡單概括:    Spring保證先執行 postProcessBeanDefinitionRegistry() 方法;

      保證先執行通過手動添加進來的后置處理器,后執行代碼實現的后置處理器

      BeanDefinitionRegistryPostProcessor優先級高於BeanFactoryPostProcessor

      手動添加的BeanDefinitionRegistryPostProcessor》實現了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor》實現了Ordered接口BeanDefinitionRegistryPostProcessor》其他的BeanDefinitionRegistryPostProcessor

      》手動添加的BeanFactoryPostProcessor》實現了PriorityOrdered接口的BeanFactoryPostProcessor》實現了Ordered接口的BeanFactoryPostProcessor》其他的BeanFactoryPostProcessor

 

代碼邏輯:

    在Spring源碼中,

AbstractApplicationContext的invokeBeanFactoryPostProcessors方法,核心源碼貼出
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
                // BeanDefinitionRegistryPostProcessor是一個特殊的BeanFactoryPostProcessor,需要先執行postProcessBeanDefinitionRegistry方法
                if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
                    BeanDefinitionRegistryPostProcessor registryProcessor =
                            (BeanDefinitionRegistryPostProcessor) postProcessor;

                    registryProcessor.postProcessBeanDefinitionRegistry(registry);

                    registryProcessors.add(registryProcessor);
                }
                else {
                    regularPostProcessors.add(postProcessor);
                }
            }

            // 保存當前需要執行的實現了BeanDefinitionRegistryPostProcessor接口的后置處理器
            // Do not initialize FactoryBeans here: We need to leave all regular beans
            // uninitialized to let the bean factory post-processors apply to them!
            // Separate between BeanDefinitionRegistryPostProcessors that implement
            // PriorityOrdered, Ordered, and the rest.
            List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

            // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
            // 首先,先執行實現了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
            String[] postProcessorNames =
                    beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
            for (String ppName : postProcessorNames) {
                // 判斷這個類是否還實現了PriorityOrdered接口
                if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                    // 這里調用了getBean,所以生成一個BeanDefinitionRegistryPostProcessor的bean對象
                    currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                    processedBeans.add(ppName);
                }
            }
            sortPostProcessors(currentRegistryProcessors, beanFactory);
            registryProcessors.addAll(currentRegistryProcessors);
            // 執行postProcessBeanDefinitionRegistry方法
            invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
            currentRegistryProcessors.clear();

            // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
            // 首先,先執行實現了Ordered接口的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
            postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
            for (String ppName : postProcessorNames) {
                if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
                    currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                    processedBeans.add(ppName);
                }
            }
            sortPostProcessors(currentRegistryProcessors, beanFactory);
            registryProcessors.addAll(currentRegistryProcessors);
            invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
            currentRegistryProcessors.clear();

            // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
            // 最后,最后其他普通的BeanDefinitionRegistryPostProcessors的postProcessBeanDefinitionRegistry方法
            boolean reiterate = true;
            // 在一個BeanDefinitionRegistryPostProcessor中可以注冊另一個BeanDefinitionRegistryPostProcessor,所以需要遞歸找出所有的BeanDefinitionRegistryPostProcessor
            // 一個沒有實現PriorityOrdered接口的BeanDefinitionRegistryPostProcessor如果在內部注冊了一個實現了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor,那么就是沒有實現PriorityOrdered接口的先執行
            while (reiterate) {
                reiterate = false;
                // 這里會再一次拿到實現了PriorityOrdered接口或Ordered接口的BeanDefinitionRegistryPostProcessor,所以需要processedBeans進行過濾
                postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
                for (String ppName : postProcessorNames) {
                    if (!processedBeans.contains(ppName)) {
                        currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                        processedBeans.add(ppName);
                        reiterate = true;
                    }
                }
                sortPostProcessors(currentRegistryProcessors, beanFactory);
                registryProcessors.addAll(currentRegistryProcessors);
                invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
                currentRegistryProcessors.clear();
            }

            //至此 所有的BeanFinition都已經注冊完成

      其中,值得一提的是,下面貼出的源碼:

            // 在一個BeanDefinitionRegistryPostProcessor中可以注冊另一個BeanDefinitionRegistryPostProcessor,所以需要遞歸找出所有的BeanDefinitionRegistryPostProcessor
            // 一個沒有實現PriorityOrdered接口的BeanDefinitionRegistryPostProcessor如果在內部注冊了一個實現了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor,那么就是沒有實現PriorityOrdered接口的先執行
            while (reiterate) {
                reiterate = false;
                // 這里會再一次拿到實現了PriorityOrdered接口或Ordered接口的BeanDefinitionRegistryPostProcessor,所以需要processedBeans進行過濾
                postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
                for (String ppName : postProcessorNames) {
                    if (!processedBeans.contains(ppName)) {
                        currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                        processedBeans.add(ppName);
                        reiterate = true;
                    }
                }
                sortPostProcessors(currentRegistryProcessors, beanFactory);
                registryProcessors.addAll(currentRegistryProcessors);
                invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
                currentRegistryProcessors.clear();
            }

這段代碼考慮的是:當其余“優先級比較高的BeanFactoryPostProcessor”被注冊進BeanFactory以及調用的時候,也有可能會在postProcessBeanDefinitionRegistry方法或者postProcessBeanFactory方法中注冊新的BeanDefinitionRegistryPostProcessor,所以使用while循環的遞歸操作,找出以后操作中可能存在的新生成的BeanDefinitionRegistryPostProcessor,如果出現,將其注冊到BeanFactory中。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM