BeanPostProcessor (Bean ポストプロセッサ) は、Bean の動的プロキシの実装など、Bean の内部値を変更するためによく使用されます。
BeanFactoryPostProcessor と BeanPostProcessor はどちらも、Spring が Bean を初期化するときに公開される拡張ポイントです。しかし、違いは何でしょうか?
「Bean のライフサイクルについて」の図から、BeanFactoryPostProcessor がライフサイクルで最も早く呼び出され、BeanPostProcessor よりもはるかに早いことがわかります。これは、Spring コンテナが Bean 定義ファイルをロードした後、Bean がインスタンス化される前に実行されます。言い換えれば、Spring では、コンテナが Bean を作成する前に、BeanFactoryPostProcessor が Bean 構成メタデータを読み取り、変更できるようになります。たとえば、Bean のプロパティと値を追加し、Bean が自動配線の候補であるかどうかをリセットし、Bean の依存関係をリセットします。
srping設定ファイルには複数のBeanFactoryPostProcessorを同時に設定でき、xmlに登録する際に「order」属性を設定することで各BeanFactoryPostProcessorの実行順序を制御できます。
BeanFactoryPostProcessor インターフェースは次のように定義されています:
public interface BeanFactoryPostProcessor { void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException; }
インターフェースにはメソッド postProcessBeanFactory が 1 つだけあります。このメソッドのパラメータは ConfigurableListableBeanFactory タイプであり、実際の開発では、その getBeanDefinition() メソッドを使用して、特定の Bean のメタデータ定義 (BeanDefinition) を取得することがよくあります。これらのメソッドがあります:
例を見てください:
構成ファイルで Bean が定義されています:
<bean id="messi" class="twm.spring.LifecycleTest.footballPlayer"> <property name="name" value="Messi"></property> <property name="team" value="Barcelona"></property> </bean>
クラス beanFactoryPostProcessorImpl を作成し、インターフェース BeanFactoryPostProcessor を実装します:
public class beanFactoryPostProcessorImpl implements BeanFactoryPostProcessor{ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { System.out.println("beanFactoryPostProcessorImpl"); BeanDefinition bdefine=beanFactory.getBeanDefinition("messi"); System.out.println(bdefine.getPropertyValues().toString()); MutablePropertyValues pv = bdefine.getPropertyValues(); if (pv.contains("team")) { PropertyValue ppv= pv.getPropertyValue("name"); TypedStringValue obj=(TypedStringValue)ppv.getValue(); if(obj.getValue().equals("Messi")){ pv.addPropertyValue("team", "阿根延"); } } bdefine.setScope(BeanDefinition.SCOPE_PROTOTYPE); } }
クラス呼び出し:
public static void main(String[] args) throws Exception { ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); footballPlayer obj = ctx.getBean("messi",footballPlayer.class); System.out.println(obj.getTeam()); }
出力:
プロパティ値: length =2; Bean プロパティ 'name'; Bean プロパティ 'チーム'
Agenyan
「PropertyPlaceholderConfigurer アプリケーション」で説明されている PropertyPlaceholderConfigurer クラスは、BeanFactoryPostProcessor インターフェースの実装です。コンテナが Bean を作成する前に、クラス定義内のプレースホルダー (${jdbc.url} など) がプロパティ ファイルの対応するコンテンツに置き換えられます。
関連する推奨事項:
Spring Bean 拡張インターフェースのメソッドの紹介
ResourceLoaderAware インターフェース - [Spring 中国語マニュアル]
以上がSpring コンテナ拡張ポイント: Bean ポストプロセッサの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。