web-dev-qa-db-ja.com

Beanの初期化が完了した後にメソッドを呼び出す方法

ApplicationContextのロード時にBean内で一度だけ(非静的)メソッドを呼び出す必要があるユースケースがあります。これにMethodInvokingFactoryBeanを使用すれば大丈夫ですか?それとも、もっと良い解決策がありますか?

ちなみに、Webアプリケーションでアプリケーションコンテキストを読み込むにはConfigContextLoaderListenerを使います。そして、Bean 'A'がインスタンス化されている場合は、methodA()を1回呼び出すだけでいいのです。

どうすればこれをうまく行うことができますか?

219
peakit

次のようなものを使うことができます。

<beans>
    <bean id="myBean" class="..." init-method="init"/>
</beans>

Beanがインスタンス化されると、これは "init"メソッドを呼び出します。

194
Mercer Traieste

他の回答で@PostConstructの提案を拡張するには、これが本当に最善の解決策です。

  • それはあなたのコードをSpring APIから切り離したままにします(@PostConstructはjavax。*にあります)
  • Initメソッドに、Beanを初期化するために呼び出す必要があるものとして明示的に注釈を付けます。
  • あなたのSpring Beanの定義にinit-method属性を追加することを忘れないでください、springは自動的にメソッドを呼び出します(とにかく、文脈のどこかにannotation-configオプションを登録したと仮定します)。
294
skaffman

参照 で説明されているように、考慮すべき3つの異なるアプローチがあります。

Init-method属性を使用する

長所:

  • インタフェースを実装するのにbeanを必要としません。

短所:

  • Beanが正しく構成されていることを確認するために、このメソッドが構築後にすぐに必要になることはありません。

InitializingBeanを実装する

長所:

  • Init-methodを指定したり、コンポーネントのスキャン/注釈処理をオンにする必要はありません。
  • ライブラリで提供されるBeanに適しています。このライブラリを使用するアプリケーションがBeanのライフサイクルに関係しないようにするためです。

短所:

  • Initメソッドよりも侵襲的です。

JSR-250を使用する @ PostConstruct lifecyleアノテーション

長所:

  • コンポーネントスキャンを使用してBeanを自動検出するときに役立ちます。
  • 初期化に特定の方法が使用されることを明確にします。意図はコードに近いです。

短所:

  • 初期化は設定で集中的に指定されなくなりました。
  • あなたは注釈処理をオンにすることを忘れないでください(これは時々忘れられることがあります)
98
toolkit

InitializingBean を実装してみましたか?それはまさにあなたがしていることのように聞こえます。

欠点は、BeanがSpringに対応するようになることですが、ほとんどのアプリケーションではそれほど悪くありません。

38
Jon Skeet

あなたはそれをするためにあなたのアプリケーションコンテキストでカスタム BeanPostProcessor をデプロイすることができます。あるいは、SpringインタフェースをBeanに実装しても構わない場合は、 InitializingBean インタフェースまたは "init-method"ディレクティブ(同じリンク)を使用できます。

8
Rob H