2016-09-22 2 views
0

次のような状況があります。私のマイクロサービスでは、[MA]私は、アプリケーションの起動後、または何らかのイベントに基づいていくつかのBeanを初期化/破棄したいと思います。想像力のために、ContentStoresについての情報を保持する別のマイクロサービス[MB]があります。 MAの起動後、contentstoreエントリのためにMBと頼みたいと思っています。それに基づいて、必要に応じて多くの豆を作りたいと思います。 storeCreated/storeDeletedをトリガーするイベントがある可能性があります。この場合、Beanを破棄する必要があります。アプリケーション起動後/アプリケーションイベント後のBeanの初期化[spring]

私は現在どのインタフェースを実装する必要があるのか​​わからないので、いくつかの提案をしてください。

だから、ApplicationListenerとイベントApplicationReadyEventから始めましょう。この2つでは、MAが初期化されており、おそらくストアのリストについてMBと聞くことができます。

ここではイベントのapplicationContextを利用してBeanを作成できます(各BeanにはIDなどの独自の修飾子があります)。必要に応じて依存関係を自動生成します。

しかし、ここからは、作成したBeanをApplicationContextに追加する方法がわかりません。

アプリケーションイベントに対しても同じメカニズムが存在しますが、その場合は、最初にBeanが作成されているかどうかを確認し、そうであれば返すことができます。

注:私はスプリングブート1.4を使用しています。

おかげ

+0

あなたは子アプリケーションコンテを使用して検討していますxt?その後、それをリフレッシュして豆を作り、それを閉じてそれらを破壊することができます。 Beanを作成する方法は、要件に応じて決まります。あなたが作成する必要がある豆を記述できますか?固定された既知の数の豆があり、あなたの他のサービスからの構成が必要なだけですか、または豆の数は変わりますか? –

+0

こんにちはAndy、豆の数は変化し、2番目のサービスに依存します。基本的には1-nのコンテンツストアがあり、アプリケーションの起動時またはリモートサービスで新しいcontentStoreエントリが作成されたときにインスタンス化する必要があります。その時点で、contentStoreが削除されている状況が起こる可能性があるので、アプリケーションからそのBeanを削除する必要があります。 – bilak

+0

@AndyWilkinson [this](https://github.com/bilak/spring-bean-initializer-test)をご覧ください。 – bilak

答えて

0

私は、アプリケーションの起動後、いくつかの豆を破壊/初期化したい、またはいくつかのイベントに基づいて思います。この質問のために

、あなたは代替BeanDefinition

を登録するorg.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessorを使用してBeanを、会員登録をすることができます豆で@PostConstructを使用している - 「PostConstruct注釈を後に実行する必要がある方法で使用されています依存性注入は、任意の初期化を実行するために行われる「アプリケーションの終了については

、あなたはここでアプリケーションの終了フックを使用することができます - 。doc

+0

BeanDefinitionRegistryPostProcessorはいつ実行されますか?応募開始時ですか?もしそうなら、私はこれを使うことができません。なぜなら、このプロセスをアプリケーションの実行にも必要とするからです。 – bilak

+0

@bilakそれは 'refresh()'の文脈で呼び出すので、それを実行してから 'ConfigurableApplicationContext#refresh()'を実行してすべてのBeanをロードすると、バッキングBeanのファクトリは上書きされ、新しいものが作成されました。 –

+0

[こちら](https://github.com/bilak/spring-bean-initializer-test)をご覧ください。 mvn spring-bootを実行すると、問題が表示されます。私はContentStoreInitializerでBeanを初期化しています。しかし、私がFileSystemContentStoreServiceでそれらにアクセスしようとすると、私はそれらを得ることができません。正しい方法で作成してアクセスしているのか分かりません。ありがとう – bilak

関連する問題