Spring BeanPostProcessorはどのように正確に機能しますか?


94

Spring Core認定について勉強しています。SpringBeanのライフサイクルをどのように処理するか、特にBeanポストプロセッサについては疑問があります

だから私はこのスキーマを持っています:

ここに画像の説明を入力してください

それが何を意味するかは私にはかなり明らかです:

次の手順は、Bean定義ロード段階で行われます。

  • @Configurationのクラスが処理され、および/または@Componentsがスキャンされ、および/またはXMLファイルが解析されます。

  • BeanFactoryに追加されたBean定義(それぞれはそのIDでインデックスが付けられます)

  • 呼び出された特別なBeanFactoryPostProcessor Beanは、任意のBeanの定義を変更できます(たとえば、プロパティー-プレースホルダー値の置換用)。

次に、次の手順がBean作成フェーズで行われます。

  • 各Beanはデフォルトで積極的にインスタンス化されます(依存関係が挿入された正しい順序で作成されます)。

  • 依存関係の注入後、各Beanは後処理フェーズを通過し、追加の構成と初期化が行われる可能性があります。

  • 後処理後、Beanは完全に初期化され、使用できる状態になります(コンテキストが破棄されるまで、IDによって追跡されます)

わかりました、これは私にはかなり明確であり、次の2種類のBeanポストプロセッサがあることも知っています。

  • 初期化子:指示された場合はBeanを初期化します(つまり、@ PostConstruct)。

  • そしてすべての残り:追加の設定を可能にし、それが初期化工程の前または後に実行可能

そして私はこのスライドを投稿します:

ここに画像の説明を入力してください

したがって、イニシャライザ Beanポストプロセッサが何を行うかは非常に明確です(これらは@PostContructアノテーションが付けられたメソッドであり、セッターメソッドの直後に(つまり、依存関係の注入後に)自動的に呼び出されます)。いくつかの初期化バッチを実行します(前の例のようにキャッシュに入力します)。

しかし、他のBeanポストプロセッサを正確に表すものは何でしょうか。これらのステップが初期化フェーズの前または後に実行されるとはどういう意味ですか?

そのため、私のBeanがインスタンス化され、その依存関係が注入されるため、初期化フェーズは(@PostContructアノテーション付きメソッドの実行によって)完了します。初期化フェーズの前にBean Post Processorが使用されているとはどういう意味ですか?@PostContructアノテーション付きメソッドの実行前に発生するということですか?これは、依存関係の注入前(セッターメソッドが呼び出される前)に発生する可能性があることを意味しますか?

そして、それが初期化ステップの後に実行されると言うとき、私たちは正確にどういう意味ですか。@PostContructアノテーション付きメソッドの実行後に発生することを意味しますか?

@PostContructアノテーション付きメソッドが必要な理由を頭の中で簡単に理解できますが、他の種類のBeanポストプロセッサの典型的な例を理解できません。


スライドの画像は共有しないでください:)
登録

@Regこれらの画像の正確なコース/プレゼンテーションは何ですか?
Malvon

@Malvonこれは、Pivo​​talの公式Springコアコースの前の版からのものです。AND BTW-試験の準備をしている場合は、XMLを使用して何も無視してください:)
Reg

@Reg実際にトレーニングクラスに参加せずにコースを購入する方法はありますか?
Malvon、

ダイアグラムの「紫色の部分のBean定義のポストプロセス」で何が起きているのでしょうか。
Akshay Hiremath

回答:


48

Spring docは、BeanPostProcessorを使用したBeanのカスタマイズのBPPについて説明しています。BPP Beanは、他のBeanの前に作成され、新しく作成されたBeanと相互作用する特別な種類のBeanです。この構造により、Springは、BeanPostProcessor自分で実装するだけで、ライフサイクル動作に接続してカスタマイズする手段を提供します。

のようなカスタムBPPを持つ

public class CustomBeanPostProcessor implements BeanPostProcessor {

    public CustomBeanPostProcessor() {
        System.out.println("0. Spring calls constructor");
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println(bean.getClass() + "  " + beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println(bean.getClass() + "  " + beanName);
        return bean;
    }
}

呼び出され、作成されたすべてのBeanのクラスとBean名を出力します。

メソッドがどのようにBeanのライフサイクルに適合するか、およびメソッドが正確に呼び出されたときにドキュメントを確認する

postProcessBeforeInitialization(Object bean、String beanName) Bean初期化コールバック(InitializingBeanのafterPropertiesSetまたはカスタムinitメソッドなど)の前に、このBeanPostProcessorを指定された新しいBeanインスタンスに適用します。

postProcessAfterInitialization(Object bean、String beanName) Bean初期化コールバック(InitializingBeanのafterPropertiesSetまたはカスタムinitメソッドなど)の後で、このBeanPostProcessorを指定された新しいBeanインスタンスに適用します。

重要なビットはまたです

Beanにはすでにプロパティ値が入力されています。

@PostConstructこのアノテーションはpostProcessAfterInitializationメソッドを宣言する便利な方法であり、Bean構成ファイルで登録CommonAnnotationBeanPostProcessorまたは指定するときにSpringがそれを認識するというメモとの関係については、メソッドが他の前または後に実行される<context:annotation-config />かどうかは、プロパティに依存します@PostConstructpostProcessAfterInitializationorder

複数のBeanPostProcessorインスタンスを設定でき、orderプロパティを設定することで、これらのBeanPostProcessorが実行される順序を制御できます。


30

Beanポストプロセッサの典型的な例は、@Transactionalアノテーションを使用する場合など、元のBeanをプロキシインスタンスでラップする場合です。

Beanポストプロセッサには、Beanの元のインスタンスが渡され、ターゲットの任意のメソッドを呼び出すことができますが、アプリケーションコンテキストでバインドする必要がある実際のBeanインスタンスを返すこともできます。必要なオブジェクト。これが役立つ典型的なシナリオは、Beanポストプロセッサーがターゲットをプロキシインスタンスでラップする場合です。アプリケーションコンテキストにバインドされたBeanのすべての呼び出しはプロキシを通過し、プロキシはターゲットBeanの呼び出しの前または後に、AOPやトランザクション管理などのマジックを実行します。


6
実例の称賛!
16年

理論だけでなく実際のユースケースを提供していただきありがとう
ございます

4

違いはBeanPostProcessor、コンテキストの初期化にフックしてpostProcessBeforeInitializationからpostProcessAfterInitialization、定義されたすべてのBeanを呼び出します。

ただし@PostConstruct、コンストラクターまたはsetメソッドの後でBeanの作成をカスタマイズする特定のクラスにのみ使用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.