Spring容器初始化之invokeBeanFactoryPostProcessors()源碼分析

invokeBeanFactoryPostProcessors方法會實例化所有 BeanFactoryPostProcessor 以及其子類 BeanDefinitionRegistryPostProcessor。這兩個類主要針對的是BeanFactory的,其作用是在 BeanDefinition 創建之後,Bean 實例化對象前對 BeanDefinition 對象相關屬性進行修改;另外還有一個類叫 BeanPostProcessor,該類主要針對的是 Bean 操作的。關於這兩個類的區別我會在下一篇內容介紹。

1. 在講AbstractApplicationContext.refresh()invokeBeanFactoryPostProcessors開始之前。在講之前先簡單說下爲啥沒有講prepareBeanFactorypostProcessBeanFactory兩個方法,因爲這兩個方法都特別簡單,第一個方法是爲BeanFactory設置各種各樣的屬性,包括一些BeanPostProcessor的設置(BeanPostProcessor後面會專門講解)等等,第二個方法沒有具體實現,是爲開發者留出擴展的。

AbstractApplicationContext.invokeBeanFactoryPostProcessors()方法實現
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
       // 獲取context中已添加的beanFactoryPostProcessors
       // 實例化並調用所有BeanFactoryPostProcessors
       // 主要實現也是在該方法裏面進行實現
    PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
    // Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
    // (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
    if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
      beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
      beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
    }
}

2. 該方法的主要實現在invokeBeanFactoryPostProcessors方法裏面進行實現的。雖然這個方法特別長,但是邏輯很簡單,耐心看下去

  • BeanFactoryPostProcessor:一切處理BeanFactory的父接口

  • BeanDefinitionRegistryPostProcessor:實現了BeanFactoryPostProcessor接口的接口

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors()方法實現
public static void invokeBeanFactoryPostProcessors(
      ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
    // Invoke BeanDefinitionRegistryPostProcessors first, if any.
    Set<String> processedBeans = new HashSet<>();
       // Step1:beanFactory是BeanDefinitionRegistry接口或者是其子類
    if (beanFactory instanceof BeanDefinitionRegistry) {
      BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
      // Step2:存放普通的beanFactoryPostProcessors
      List<BeanFactoryPostProcessor> regularPostProcessors = new LinkedList<>();
      // Step3:存放beanDefinitionRegistryPostProcessors
      List<BeanDefinitionRegistryPostProcessor> registryProcessors = new LinkedList<>();
          // Step4:首先處理接口傳進來的factoryPostProcessors
      for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
          // Step5:實現了BeanDefinitionRegistryPostProcessor接口的factoryPostProcessor
        if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
          BeanDefinitionRegistryPostProcessor registryProcessor =
              (BeanDefinitionRegistryPostProcessor) postProcessor;
          // Step6:直接調用其實現
          registryProcessor.postProcessBeanDefinitionRegistry(registry);
          // Step7:添加到registryProcessors裏面,後面調用 BeanFactoryPostProcessor.postProcessBeanFactory()方法
          registryProcessors.add(registryProcessor);
        }
        else {
            // Step8:非BeanFactoryProcessor及其子類的,直接添加到regularPostProcessors裏面,後面調用執行postProcessorBeanFactory方法
          regularPostProcessors.add(postProcessor);
        }
      }
      // 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.
      // Step9:獲取所有BeanDefinitionRegistryPostProcessor實現的子類並且實現了PriorityOrdered接口的factoryPostProcessor
      String[] postProcessorNames =
          beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
      for (String ppName : postProcessorNames) {
        if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
          currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
          processedBeans.add(ppName);
        }
      }
      // Step10:排序
      sortPostProcessors(currentRegistryProcessors, beanFactory);
      // Step11:添加到registryProcessors中,後面調用postProcessorBeanFactory方法
      registryProcessors.addAll(currentRegistryProcessors);
      // Step12:遍歷執行每個factoryPostProcessor的postProcessBeanDefinitionRegistry方法
      invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
      // Step13:清空
      currentRegistryProcessors.clear();
      // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
      // Step14:獲取所有BeanDefinitionRegistryPostProcessor並且實現了Ordered接口的factoryPostProcessor
      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);
        }
      }
      // Step15:排序
      sortPostProcessors(currentRegistryProcessors, beanFactory);
      // Step16:添加到registryProcessors中,後面調用postProcessorBeanFactory方法
      registryProcessors.addAll(currentRegistryProcessors);
      // Step17:遍歷每個factoryPostProcessor的postProcessorBeanDefinitionRegistry方法
      invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
      // Step18:清空
      currentRegistryProcessors.clear();
      // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
      // Step19:獲取所有實現了BeanDefinitionRegistryPostProcessor接口的類,且沒有實現PriorityOrdered接口和Ordered接口的類
      boolean reiterate = true;
      while (reiterate) {
        reiterate = false;
        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;
          }
        }
        // Step20:排序
        sortPostProcessors(currentRegistryProcessors, beanFactory);
        // Step21:添加到registryProcessors中,後面調用PostProcessorBeanFactory方法
        registryProcessors.addAll(currentRegistryProcessors);
        // Step22:遍歷每個factoryPostProcessor的PostProcessorBeanDefinitionRegistry方法
        invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
        currentRegistryProcessors.clear();
      }
      // Now, invoke the postProcessBeanFactory callback of all processors handled so far.
      // Step23:所有實現了BeanDefinitionRegistryPostProcessor接口的類,調用beanFactoryPostProcessors方法
      invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
      // Step24:所有實現了BeanFactoryPostProcessor接口的類,調用BeanFactoryPostProcessor方法
      invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
    }
    else {
      // Invoke factory processors registered with the context instance.
      // Step26:所有非BeanDefinitionRegistry接口及其子類的工廠,直接調用BeanFactoryPostProcessor方法
      invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
    }
    // Do not initialize FactoryBeans here: We need to leave all regular beans
    // uninitialized to let the bean factory post-processors apply to them!
    // Step27:獲取所有實現了BeanFactoryPostProcessor接口的類名
    String[] postProcessorNames =
        beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
    // Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
    // Ordered, and the rest.
    List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
    List<String> orderedPostProcessorNames = new ArrayList<>();
    List<String> nonOrderedPostProcessorNames = new ArrayList<>();
    for (String ppName : postProcessorNames) {
        // Step28:跳過已經invoke的factoryPostProcessor
      if (processedBeans.contains(ppName)) {
        // skip - already processed in first phase above
      }
      // Step29:實現了BeanFactoryPostProcessor接口並且實現了PriorityOrdered接口的類
      else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
        priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
      }
      // Step30:實現了BeanFactoryPostProcessor並且實現了Ordered接口的類
      else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
        orderedPostProcessorNames.add(ppName);
      }
      else {
         // Step31:普通的BeanFactoryPostProcessor類
        nonOrderedPostProcessorNames.add(ppName);
      }
    }
    // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
    // Step32:排序
    sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
    // Step33:調用BeanFactoryPostProcessor方法
    invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
    // Next, invoke the BeanFactoryPostProcessors that implement Ordered.
    // Step34:實現了Ordered接口排序並調用BeanFactoryPostProcessor方法
    List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();
    for (String postProcessorName : orderedPostProcessorNames) {
      orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
    }
    sortPostProcessors(orderedPostProcessors, beanFactory);
    invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
    // Finally, invoke all other BeanFactoryPostProcessors.
    // Step35:普通的BeanFactoryPostProcessor調用beanFactoryPostProcessor方法
    List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
    for (String postProcessorName : nonOrderedPostProcessorNames) {
      nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
    }
    invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
    // Clear cached merged bean definitions since the post-processors might have
    // modified the original metadata, e.g. replacing placeholders in values...
    beanFactory.clearMetadataCache();
}

總結

  1. 先加載預先在上線文中定義的BeanFactoryPostProcessor

  2. 然後加載實現了BeanDefinitionRegistryPostProcessor接口的BeanFactoryPostProcessor

  3. 然後加載實現了BeanFactoryPostProcessor接口的類

  4. 在 Spring 和 mybatis 整合中,MapperScannerConfigurer.java 就實現了BeanDefinitionRegistryPostProcessor接口,在其實現的方法postProcessorBeanDefinitionRegistry中,掃描basePackage指定的路徑,將該目錄下的類封裝成BeanDefinition 並加載到BeanFactory中。所以項目中的接口不需要配置在 XML 文件中或者用註解聲明,而可以直接使用 Dao 類對應的實例化對象。再比如PropertySourcesPlaceholderConfigurer(實現了context:property-placeholder的功能),主要作用是替換掉 ${} 佔位符的內容,其重寫了postProcessorBeanFactory方法


講完invokeBeanFactoryPostProcessors相關實現後,下一篇我們來看看registerBeanPostProcessors都實現了些什麼功能,它和本篇文章將的invokeBeanFactoryPostProcessors方法有什麼區別。


歡迎關注我,共同學習

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章