序文
これまでの記事では、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());
// BeanFactoryでBeanFactoryPostProcessor タイプのすべてのコンポーネントを 直接検索し、(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()メソッドを順番にトリガーします