工作内容

注册拦截 bean 创建的处理器。
这个过程和 IOC 容器启动过程 4-postProcessBeanFactory () 中的用户扩展很类似。
这里的扩展点影响 bean 的实例化操作。

  1. public static void registerBeanPostProcessors(
  2. ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
  3. String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
  4. // Register BeanPostProcessorChecker that logs an info message when
  5. // a bean is created during BeanPostProcessor instantiation, i.e. when
  6. // a bean is not eligible for getting processed by all BeanPostProcessors.
  7. int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
  8. beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
  9. // Separate between BeanPostProcessors that implement PriorityOrdered,
  10. // Ordered, and the rest.
  11. List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
  12. List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
  13. List<String> orderedPostProcessorNames = new ArrayList<>();
  14. List<String> nonOrderedPostProcessorNames = new ArrayList<>();
  15. for (String ppName : postProcessorNames) {
  16. if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
  17. BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
  18. priorityOrderedPostProcessors.add(pp);
  19. if (pp instanceof MergedBeanDefinitionPostProcessor) {
  20. internalPostProcessors.add(pp);
  21. }
  22. } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
  23. orderedPostProcessorNames.add(ppName);
  24. } else {
  25. nonOrderedPostProcessorNames.add(ppName);
  26. }
  27. }
  28. // First, register the BeanPostProcessors that implement PriorityOrdered.
  29. sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
  30. registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
  31. // Next, register the BeanPostProcessors that implement Ordered.
  32. List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
  33. for (String ppName : orderedPostProcessorNames) {
  34. BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
  35. orderedPostProcessors.add(pp);
  36. if (pp instanceof MergedBeanDefinitionPostProcessor) {
  37. internalPostProcessors.add(pp);
  38. }
  39. }
  40. sortPostProcessors(orderedPostProcessors, beanFactory);
  41. registerBeanPostProcessors(beanFactory, orderedPostProcessors);
  42. // Now, register all regular BeanPostProcessors.
  43. List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
  44. for (String ppName : nonOrderedPostProcessorNames) {
  45. BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
  46. nonOrderedPostProcessors.add(pp);
  47. if (pp instanceof MergedBeanDefinitionPostProcessor) {
  48. internalPostProcessors.add(pp);
  49. }
  50. }
  51. registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
  52. // Finally, re-register all internal BeanPostProcessors.
  53. sortPostProcessors(internalPostProcessors, beanFactory);
  54. registerBeanPostProcessors(beanFactory, internalPostProcessors);
  55. // Re-register post-processor for detecting inner beans as ApplicationListeners,
  56. // moving it to the end of the processor chain (for picking up proxies etc).
  57. beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
  58. }

主要流程

阶段1-查找BeanPostProcessor

  1. // 查找所有实现了BeanPostProcessor的bean,得到名称的集合
  2. String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

阶段2-注册一个记录日志的BeanPostProcessor

  1. /**
  2. * 注册的一个BeanPostProcessorChecker,用来记录写日志信息
  3. */
  4. int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
  5. beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

这里面有个beanProcessorTargetCount计数,它的来源分为三个部分:

  • beanFactory.getBeanPostProcessorCount():这些来自prepareBeanFactory阶段注册的
  • +1 : 这是下面要注册的一个BeanPostProcessorChecker,用来记录写日志信息
  • postProcessorNames.length:这些就是我们自己通过接口注册的

    阶段3-分组 BeanPostProcessor

    根据优先级的接口分组
    1. List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
    2. List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
    3. List<String> orderedPostProcessorNames = new ArrayList<>();
    4. List<String> nonOrderedPostProcessorNames = new ArrayList<>();
    5. for (String ppName : postProcessorNames) {
    6. if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
    7. BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
    8. priorityOrderedPostProcessors.add(pp);
    9. if (pp instanceof MergedBeanDefinitionPostProcessor) {
    10. internalPostProcessors.add(pp);
    11. }
    12. } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
    13. orderedPostProcessorNames.add(ppName);
    14. } else {
    15. nonOrderedPostProcessorNames.add(ppName);
    16. }
    17. }

    阶段4-对各个分组排序后注册备用

    ```java // First, register the BeanPostProcessors that implement PriorityOrdered. sortPostProcessors(priorityOrderedPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

// Next, register the BeanPostProcessors that implement Ordered. List orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size()); for (String ppName : orderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); orderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } sortPostProcessors(orderedPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, orderedPostProcessors);

// Now, register all regular BeanPostProcessors. List nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size()); for (String ppName : nonOrderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); nonOrderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

// Finally, re-register all internal BeanPostProcessors. sortPostProcessors(internalPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, internalPostProcessors);

// Re-register post-processor for detecting inner beans as ApplicationListeners, // moving it to the end of the processor chain (for picking up proxies etc). beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext)); ```