得到处理器后,开始调用这些扩展的处理器。

    1. public static void invokeBeanFactoryPostProcessors(
    2. ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
    3. // Invoke BeanDefinitionRegistryPostProcessors first, if any.
    4. Set<String> processedBeans = new HashSet<>();
    5. if (beanFactory instanceof BeanDefinitionRegistry) {
    6. BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
    7. List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
    8. List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
    9. for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
    10. if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
    11. BeanDefinitionRegistryPostProcessor registryProcessor =
    12. (BeanDefinitionRegistryPostProcessor) postProcessor;
    13. registryProcessor.postProcessBeanDefinitionRegistry(registry);
    14. registryProcessors.add(registryProcessor);
    15. }
    16. else {
    17. regularPostProcessors.add(postProcessor);
    18. }
    19. }
    20. // Do not initialize FactoryBeans here: We need to leave all regular beans
    21. // uninitialized to let the bean factory post-processors apply to them!
    22. // Separate between BeanDefinitionRegistryPostProcessors that implement
    23. // PriorityOrdered, Ordered, and the rest.
    24. List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
    25. // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
    26. String[] postProcessorNames =
    27. beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
    28. for (String ppName : postProcessorNames) {
    29. if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
    30. currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
    31. processedBeans.add(ppName);
    32. }
    33. }
    34. sortPostProcessors(currentRegistryProcessors, beanFactory);
    35. registryProcessors.addAll(currentRegistryProcessors);
    36. invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
    37. currentRegistryProcessors.clear();
    38. // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
    39. postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
    40. for (String ppName : postProcessorNames) {
    41. if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
    42. currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
    43. processedBeans.add(ppName);
    44. }
    45. }
    46. sortPostProcessors(currentRegistryProcessors, beanFactory);
    47. registryProcessors.addAll(currentRegistryProcessors);
    48. invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
    49. currentRegistryProcessors.clear();
    50. // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
    51. boolean reiterate = true;
    52. while (reiterate) {
    53. reiterate = false;
    54. postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
    55. for (String ppName : postProcessorNames) {
    56. if (!processedBeans.contains(ppName)) {
    57. currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
    58. processedBeans.add(ppName);
    59. reiterate = true;
    60. }
    61. }
    62. sortPostProcessors(currentRegistryProcessors, beanFactory);
    63. registryProcessors.addAll(currentRegistryProcessors);
    64. invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
    65. currentRegistryProcessors.clear();
    66. }
    67. // Now, invoke the postProcessBeanFactory callback of all processors handled so far.
    68. invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
    69. invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
    70. }
    71. else {
    72. // Invoke factory processors registered with the context instance.
    73. invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
    74. }
    75. // Do not initialize FactoryBeans here: We need to leave all regular beans
    76. // uninitialized to let the bean factory post-processors apply to them!
    77. String[] postProcessorNames =
    78. beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
    79. // Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
    80. // Ordered, and the rest.
    81. List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
    82. List<String> orderedPostProcessorNames = new ArrayList<>();
    83. List<String> nonOrderedPostProcessorNames = new ArrayList<>();
    84. for (String ppName : postProcessorNames) {
    85. if (processedBeans.contains(ppName)) {
    86. // skip - already processed in first phase above
    87. }
    88. else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
    89. priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
    90. }
    91. else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
    92. orderedPostProcessorNames.add(ppName);
    93. }
    94. else {
    95. nonOrderedPostProcessorNames.add(ppName);
    96. }
    97. }
    98. // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
    99. sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
    100. invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
    101. // Next, invoke the BeanFactoryPostProcessors that implement Ordered.
    102. List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
    103. for (String postProcessorName : orderedPostProcessorNames) {
    104. orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
    105. }
    106. sortPostProcessors(orderedPostProcessors, beanFactory);
    107. invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
    108. // Finally, invoke all other BeanFactoryPostProcessors.
    109. List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
    110. for (String postProcessorName : nonOrderedPostProcessorNames) {
    111. nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
    112. }
    113. invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
    114. // Clear cached merged bean definitions since the post-processors might have
    115. // modified the original metadata, e.g. replacing placeholders in values...
    116. beanFactory.clearMetadataCache();
    117. }

    这块代码很长,但是分开以后看,每块做的事情很清楚,如下章节。