8

Tomcat 6.0.18内でWebアプリケーションを起動すると、システムを初期化するために必要なもの、つまり今のところデータベースの移行だけでSpringをブートストラップします。移行が正常に完了するまで、システムのどの部分もロードしたくありません。これにより、他のBeanが移行の完了を待ってから操作したり、インスタンス化したりする必要がなくなります。

私はstartup-appcontext.xmlをdbMigrationDAO、ThreadPoolExecutorであるstartupManager、そして最後にFullSystemLauchBeanで構成しています。セッターインジェクションを介して、構成場所のリストをFullSystemLaunchBeanに渡します。FullSystemLaunch BeanはServletContextAwareを実装し、現在のWebApplicationContextへの参照を取得するため、 ConfigurableListableBeanFactoryを持つことができます。残念ながら、このBeanファクトリisConfigurationFrozen()はtrueを返すため、beanFactory.setConfigLocations(configLocations)を呼び出しても効果はありません。

私はこれを達成できますか、それとも春はそれが少し普通ではないので私がそうすることを妨げていますか?理解すればそれは合理的なようですが、少し危険でもあります。そして、はい、私は現在のコンテキストを吹き飛ばしたいと思っています。初期化が完了すると、現在ロードされているシングルトンは必要ありません。

お手伝いありがとう。

4

6 に答える 6

3

私の意見では、Spring が宣言された依存関係の順序で適切と思われる Bean を初期化できるようにすることです。

データベースの移行が必要な場合は、最初に実行するパターンがいくつかあります。

  • Hibernate/JPA を使用している場合は、sessionFactory/persistenceManagerを移行 Beanに依存させます。
  • プレーンな JDBC を使用している場合は、ラッパー DataSource を作成し、そのinit-methodで移行を呼び出します (コード サンプル)

利点は明らかです: シンプルです。

于 2009-06-23T06:59:26.483 に答える
2

既存のコンテキストを他のコンテキストの親コンテキストとして使用できますが、既存の WebApplicationContext を置き換えることができるとは思えません。

EAR - WAR パッケージを使用する場合、EAR からアプリケーション コンテキストをロードし、それを WAR に追加することで、すぐに使用できる (一種の) ものを取得できます。

これがあなたの状況に当てはまるかどうかはわかりません。

于 2009-06-21T15:22:41.203 に答える
0

WebApplicatonContext を ConfigurableWebApplicationContext にアップキャットしてから、setConfigurations メソッドを使用できます。

リフレッシュを忘れないでください。

于 2009-09-19T10:27:53.123 に答える
0

同じタスクがあり、2 つのコンテキストを作成しました:startUpContext.xmlapplicationContext.xml. startUpContext.xmlのロードをトリガーする Bean がありappliationContext.xmlます。(アプリケーション コンテキストの場所はstartUpContext.xml、トリガーのプロパティとして構成されます)。最後に、トリガーは現在のコンテキストの場所を置き換えて更新します。

applicationContext.setConfigLocations(locations);
applicationContext.refresh();

(startUpContext.xml は、標準の Spring コンテキスト ローダー リスナーで読み込まれます)

于 2009-09-19T10:42:17.743 に答える
0

遅延初期化は、あなたが達成しようとしていることの代わりになるでしょうか?

于 2009-06-22T10:19:31.203 に答える