ホームページ  >  記事  >  Java  >  Spring コンテナ拡張ポイント: Bean ポストプロセッサ

Spring コンテナ拡張ポイント: Bean ポストプロセッサ

php是最好的语言
php是最好的语言オリジナル
2018-08-10 15:07:112360ブラウズ

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) を取得することがよくあります。これらのメソッドがあります:
Spring コンテナ拡張ポイント: Bean ポストプロセッサ

例を見てください:
構成ファイルで 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。