2

コンストラクターインジェクションを使用して作成されたSpringBeanのセットがあります。(設計上)他のBeanへの循環参照があるため、他のBeanへの参照を注入するために、すべてのBeanが作成されたら、Beanを後処理したいと思います。

BeanPostProcessorを最初に使用しようとすると、すべてがインスタンス化されるまで待機せずに、各Beanがインスタンス化された後にBeanPostProcessorが実行されていることが示されます。

Springは、すべてが作成された後、Beanのセットとして後処理するためのメカニズムを提供しますか?

4

2 に答える 2

2

ApplicationContextでBeanを作成している場合、ApplicationContextは、登録されているApplicationListenerコールバックに対してApplicationEventsを起動します。それらの1つは、コンテキスト内のすべてのBeanがSpringを介して相互に接続されている場合に通知する必要があります。

于 2012-07-25T17:58:06.357 に答える
0

循環依存についてのドキュメントの内容は次のとおりです。

主にコンストラクターインジェクションを使用する場合、解決できない循環依存シナリオを作成する可能性があります。

例:クラスAにはコンストラクターインジェクションによるクラスBのインスタンスが必要であり、クラスBにはコンストラクターインジェクションによるクラスAのインスタンスが必要です。クラスAとBのBeanを相互に注入するように構成すると、Spring IoCコンテナーは実行時にこの循環参照を検出し、BeanCurrentlyInCreationExceptionをスローします。

考えられる解決策の1つは、コンストラクターではなくセッターによって構成されるいくつかのクラスのソースコードを編集することです。または、コンストラクターインジェクションを避け、セッターインジェクションのみを使用します。つまり、推奨されていませんが、セッターインジェクションを使用して循環依存関係を構成できます。

通常の場合(循環依存関係なし)とは異なり、BeanAとBeanBの間の循環依存関係により、完全に初期化される前に一方のBeanが他方に注入されます(従来の鶏/卵のシナリオ)。

この場合はセッターインジェクションを使用するか、そもそも循環依存を避けようとします。もう1つの解決策は、Beanの1つをBeanFactoryAwareにし、参照が必要なときにBeanファクトリから他のBeanを検索することです。

于 2012-07-25T17:50:03.837 に答える