255

Beanで(非静的)メソッドを呼び出す必要があるユースケースがあります-ApplicationContextのロード時に1回だけです。これにMethodInvokingFactoryBeanを使用しても大丈夫ですか?または、より良い解決策がありますか?

補足として、ConfigContextLoaderListenerを使用してWebアプリケーションにアプリケーションコンテキストをロードします。そして、Bean'A'がインスタンス化された場合、methodA()を1回呼び出すだけです。

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

4

6 に答える 6

334

@PostConstruct私の意見では、他の回答の提案を拡張するために、これは本当に最良の解決策です。

  • これにより、コードがSpring APIから切り離された状態に保たれます(@PostConstructにありますjavax.*
  • Beanを初期化するために呼び出す必要があるものとしてinitメソッドに明示的に注釈を付けます
  • Spring Bean定義にinit-method属性を追加することを覚えておく必要はありません。Springは自動的にメソッドを呼び出します(とにかく、コンテキスト内の別の場所にannotation-configオプションを登録すると仮定します)。
于 2009-08-14T08:57:59.763 に答える
205

次のようなものを使用できます。

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

これにより、Beanがインスタンス化されるときに「init」メソッドが呼び出されます。

于 2009-07-06T18:37:49.640 に答える
108

参考文献に記載されているように、考慮すべき3つの異なるアプローチがあります

init-method属性を使用する

長所:

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

短所:

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

InitializingBeanを実装します

長所:

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

短所:

  • init-methodアプローチよりも侵襲的です。

JSR-250 @PostConstructライフサイクルアノテーションを使用する

長所:

  • コンポーネントスキャンを使用してBeanを自動検出する場合に便利です。
  • 初期化に特定の方法を使用することが明確になります。インテントはコードに近いです。

短所:

  • 初期化は、構成で一元的に指定されなくなりました。
  • 注釈処理をオンにすることを忘れないでください(忘れられることがあります)
于 2009-07-06T23:38:43.840 に答える
41

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

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

于 2009-07-06T18:35:28.787 に答える
8

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

于 2009-07-06T18:35:49.847 に答える
-7

2つのアプローチ、つまりの使用に関する混乱をさらに解消するため

  1. @PostConstruct
  2. init-method="init"

個人的な経験から、(1)使用はサーブレットコンテナでのみ機能し、(2)デスクトップアプリケーションを含むあらゆる環境で機能することに気付きました。したがって、スタンドアロンアプリケーションでSpringを使用する場合は、(2)を使用して、「初期化後にこのメソッドを呼び出す」を実行する必要があります。

于 2011-05-26T07:14:12.327 に答える