Java webapp に多数のサーブレット コンテキスト リスナーがあり、それぞれが環境に関する情報を収集しています。
それらのいくつかは、別のリスナーによって収集された情報に依存しています。しかし、リスナーが登録されて呼び出される順序を特定できないため、コードを複製する必要があります。
リスナーが web.xml での順序で登録されていることは理解していますが、これは私には少しあいまいに聞こえます。あいまいすぎて信頼できません。
私の問題を解決する方法のヒントはありますか?
Java webapp に多数のサーブレット コンテキスト リスナーがあり、それぞれが環境に関する情報を収集しています。
それらのいくつかは、別のリスナーによって収集された情報に依存しています。しかし、リスナーが登録されて呼び出される順序を特定できないため、コードを複製する必要があります。
リスナーが web.xml での順序で登録されていることは理解していますが、これは私には少しあいまいに聞こえます。あいまいすぎて信頼できません。
私の問題を解決する方法のヒントはありますか?
すべてのサーブレット コンテナーと Java EE コンテナーは、仕様のこの部分を厳密に実装します。web.xml で指定した順序でリスナーが呼び出されるという事実を信頼できます。
リクエストからのデータに遭遇すると、各フィルター/リスナーによって更新されるアプリケーションレベルのデータ構造 (HashMap) を持つことができます。これにより、各リスナーは必要なものだけを更新できます。コードの重複がないように、基本リスナーに共通コードを配置できます。
なぜそれが曖昧なのですか?web.xml での順序付けは、それらが呼び出される順序です。これは、Java EE 仕様で非常に明確に述べられています。それに頼るのはまったく問題ありません。
唯一のリスナーとして配置する ListenerManager を作成し、他のリスナーを含めることができるようです。イベントが発生したら、必要な順序 (おそらく、ListenerManager のコンストラクターで作成した順序) で他のリスナーをそれぞれ呼び出します。
残念ながら、これはリスナーを追加するときにコードが変更されることを意味しますが、プロパティ ファイルと create-from-class-name コードをうまく使用することでこれを回避できます。