05_bean factoryのバックグラウンドプロセッサの実行

3959 ワード

// Invoke factory processors registered as beans in the context. invokeBeanFactoryPostProcessors(beanFactory);をすべて表示
  • bean factoryのバックグラウンドプロセッサ
  • を実行する
    PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
    

    1.1. BeanDefinitionRegistryPostProcessorsを実行してから
    // Invoke BeanDefinitionRegistryPostProcessors first, if any.
    Set processedBeans = new HashSet();
    

    1.2. beanFactoryがBeanDefinitionRegistryインタフェースを実装している場合、受信したbean factory後置プロセッサは、BeanDefinitionRegistryPostProcessorインタフェースを実装した後置プロセッサと他の後置プロセッサに分けられ、BeanDefinitionRegistryPostProcessorのpostProcessorのpostProcessBeanDefinitionRegistryメソッドがコールバックされる.
    for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
        if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
            BeanDefinitionRegistryPostProcessor registryProcessor =
                    (BeanDefinitionRegistryPostProcessor) postProcessor;
            registryProcessor.postProcessBeanDefinitionRegistry(registry);
            registryProcessors.add(registryProcessor);
        }
        else {
            regularPostProcessors.add(postProcessor);
        }
    }
    

    注意:BeanDefinitionRegistryPostProcessorの役割は、bean定義情報の保存センターにbeanの定義情報を登録することであり、beanを登録する方法です.
    /**
     * e.g.:  bean,  , beanName firstBean Dog, beanName secondBean Cat
     * @param registry bean  beanFactory BeanDefinitionRegistry bean 
     */
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Dog.class);
        registry.registerBeanDefinition("firstBean", rootBeanDefinition);
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Cat.class).getBeanDefinition();
        registry.registerBeanDefinition("secondBean", beanDefinition);
    }
    

    1.3.すべてのBeanDefinitionRegistryPostProcessorを取得し、実装されたインタフェースに従って、PriorityOrdered -> Ordered -> の順序を並べ、それぞれpostProcessBeanDefinitionRegistryにコールバックする
    // 
    // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
    // BeanDefinitionRegistryPostProcessor
    String[] postProcessorNames =
            beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
    for (String ppName : postProcessorNames) {
        // PriorityOrdered , currentRegistryProcessors
        if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
            currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
            processedBeans.add(ppName);
        }
    }
    // currentRegistryProcessors 
    sortPostProcessors(currentRegistryProcessors, beanFactory);
    //registryProcessors , 
    registryProcessors.addAll(currentRegistryProcessors);
    // BeanDefinitionRegistryPostProcessor postProcessBeanDefinitionRegistry
    invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
    // currentRegistryProcessors
    currentRegistryProcessors.clear();
    // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
    //...
    // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
    //...
    // Ordered BeanDefinitionRegistryPostProcessors 
    

    1.4コールバックbean factoryのpostProcessBeanFactory方法
    // Now, invoke the postProcessBeanFactory callback of all processors handled so far.
    invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
    invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
    

    1.5 beanFactoryがBeanDefinitionRegistryインタフェースを実装していない場合、bean factoryのpostProcessBeanFactoryメソッド1.6を直接コールバックしてすべてのBeanFactoryPostProcessorを取得し、上記の手順と同様にソートを再分類し、postProcessBeanFactoryにコールバックする.
  • 処理AspectJ関連