Springアノテーション駆動型の開発-拡張原理BeanFactoryPostProcessor

序文

  これまでの記事では、Springでポストプロセッサー の強力な役割を見てきました。BeanPostProcessorサブインターフェースは、Beanのインスタンス化初期化強力な役割を果たす2つのカテゴリに大別できると説明されています(具体的には比較については、AOP原則を参照してください)。今日、私たちは別の種類のポストプロセッサーBeanFactoryPostProcessorを知っています。

 

BeanFactoryPostProcessor

 

 

@FunctionalInterface
 public  interface BeanFactoryPostProcessor  { 

    / ** 
     * 標準の
     初期化後にアプリケーションコンテキストの内部Beanファクトリを * 変更しますすべてのBean定義がロード
     されますが、Bean はまだインスタンス化されていません。これにより、
     eager-initializing Beanであっても*プロパティをオーバーライドまたは追加できます
     * @param beanFactoryアプリケーションコンテキストで使用されるBeanファクトリ
     * エラーの場合は@throws org.springframework.beans.BeansException
      * / 
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)BeansExceptionをスローします。

}

 

BeanFactoryPostProcessorはあるカスタマイズし、変更するたBeanFactory標準の初期化呼び出し後たBeanFactoryの内容を、
すべてのBean定義がにロード保存されていたBeanFactoryが、Beanのインスタンスがまだ作成されていない
カスタムを
BeanFactoryPostProcessor
@Component
 public  class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor { 

    @Override 
    public  void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)throws BeansException { 
        System.out.println( "MyBeanFactoryPostProcessor ... postProcessBeanFactory ..." );
        int count = beanFactory.getBeanDefinitionCount(); 
        String [] names = beanFactory.getBeanDefinitionNames(); 
        System.out.println( "当前BeanFactory中有" + count + "个Bean" ); 
        System.out.println(Arrays.asList(names));
    } 

}

IOCコンテナの呼び出しスタックを更新するときにすべてのBeanFactoryPostProcessorsを見つけてそれらのメソッドを実行する方法
        // 最後に、他のすべてのBeanFactoryPostProcessorsを呼び出します 
        。List <BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList <> (nonOrderedPostProcessorNames.size()); 
    
// BeanFactoryBeanFactoryPostProcessor タイプのすべてのコンポーネントを 直接検索し(String postProcessorName :nonOrderedPostProcessorNames){ nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName、BeanFactoryPostProcessor.class)); } invokeBeanFactoryPostProcessors(nonOrderedPostProcessors、beanFactory);

すべてのBeanFactoryPostProcessorポストプロセッサ

 

BeanDefinitionRegistryPostProcessorを  介してBean定義情報登録する

次に、コンポーネントbをBeanDefinitionRegistryPostProcessorのレジストラを介してコンテナに登録します。

@Component
 パブリック クラス MyBeanDefinitionRegistryPostProcessor 実装BeanDefinitionRegistryPostProcessor { 

    @Override 
    公共 のボイド postProcessBeanFactory(ConfigurableListableBeanFactoryたBeanFactory)はスローBeansException {
         // TODO自動生成されたスタブメソッド、 
        "MyBeanDefinitionRegistryPostProcessorの数...豆は:"のSystem.out.println(+ beanFactory.getBeanDefinitionCount() ); 
    } 

    / / BeanDefinitionRegistryビーン定義情報センター保存、たBeanFactoryをBeanDefinitionRegistry内に格納されビーンビーン定義情報のすべてのインスタンスに作成された後、
     @Override
     公衆 ボイドpostProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)BeansExceptionをスローします{
         // TODO自動生成されたメソッドスタブ 
        System.out.println( "postProcessBeanDefinitionRegistry ... bean的数量:" + registry.getBeanDefinitionCount());
        // RootBeanDefinition beanDefinition = new RootBeanDefinition(Blue.class); 
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(ブルー。クラス.getBeanDefinition()); 
        registry.registerBeanDefinition( "hello" 、beanDefinition); 
    } 

}

 

 
                } 
                sortPostProcessors(currentRegistryProcessors、beanFactory); 
                registryProcessors.addAll(currentRegistryProcessors); 
          // すべてのpostProcessBeanDefinitionRegistry()メソッドを 順に呼び出しますinvokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors、registry) ; currentRegistryProcessors.clear(); }
//すべてのプロセッサのpostProcessBeanFactoryコールバックを呼び出します。これまで扱わ
       // 再び容器から求めBeanFactoryPostProcessor アセンブリと、その後トリガpostProcessBeanFactory()メソッド
invokeBeanFactoryPostProcessors(registryProcessors、たBeanFactory)。 invokeBeanFactoryPostProcessors(regularPostProcessors、beanFactory);
 

まとめ

  BeanPostProcessor Beanの初期化用に設計されており、 BeanFactoryPostProcessor BeanFactoryの初期化用に設計されていますbeanFactoryは、Beanの定義情報を保持します。

これを使用して、いくつかのコンポーネントをコンテナーに追加できます(Bean定義の方法では、beanFactoryに追加されたBeanのすべての定義情報をインスタンス化する必要があります)。

以下は、ネットワーク
BeanPostProcessor からのものです
Beanポストプロセッサー、Bean作成オブジェクトの初期化前後のインターセプト作業 1 、BeanFactoryPostProcessor:beanFactory post-processor; BeanFactory標準初期化の後に呼び出され、BeanFactoryのコンテンツをカスタマイズおよび変更します; すべてBean定義は保存され、beanFactoryにロードされていますが、Beanのインスタンスは作成されていません 。BeanFactoryPostProcessor 原則: 1)、iocコンテナー作成オブジェクト 2)、invokeBeanFactoryPostProcessors(beanFactory); すべてのBeanFactoryPostProcessorを見つけてメソッドを実行する方法; 1)、直接BeanFactoryでタイプBeanFactoryPostProcessorのすべてのコンポーネントを検索し、それらのメソッドを実行します 2)、他のコンポーネントを最初に作成する前に実行します 2、BeanDefinitionRegistryPostProcessorがBeanFactoryPostProcessor拡張し ます。BeanDefinitionRegistryPostProcessor postProcessBeanDefinitionRegistry(); すべてのBean定義情報がロードされますが、Beanインスタンスは作成されていません 。BeanFactoryPostProcessor の実装よりも優先されます。BeanDefinitionRegistryPostProcessorを使用 してコンテナに追加のコンポーネントを追加します。 原則: 1 )、ioc create object 2)、refresh()- "invokeBeanFactoryPostProcessors( beanFactory); 3 )コンテナからすべてのBeanDefinitionRegistryPostProcessorコンポーネントを取得します。 1. すべてのpostProcessBeanDefinitionRegistry()メソッドを順番にトリガー します 2. 次に、postProcessBeanFactory()メソッドBeanFactoryPostProcessorをトリガーします; 4)次に、コンテナからBeanFactoryPostProcessorコンポーネントを見つけ、次にpostProcessBeanFactory()メソッドを順番にトリガーします

 





 

おすすめ

転載: www.cnblogs.com/tombky/p/12716985.html