IOCを気にする場合、Spring MVCでモデルを変更する最善の方法
-
03-07-2019 - |
質問
Spring MVCを使用してアプリケーションを構築しています。アプリケーション内のすべてのコントローラーのモデルに特定の変更を加えたい。特に、アプリケーションのすべてのページに存在する特定の追加データをモデルに挿入します。
これにはいくつかの方法があります:すべてのコントローラーの最後にデータを追加するだけで、余分なデータを追加するModelのサブクラスを使用し、ModelをラップするModelAndViewのサブクラスを使用し、使用する前にモデル化...他のオプションがあるはずです。
しかし、「優雅さ」があります。制約:すべてのコントローラーにコードを書きたくありません。この動作をで定義したい唯一無二の場所。理想的には、IOC Bean構成ファイルによって制御されます。
これをエレガントに達成する方法についての推奨事項はありますか?
解決
アスペクトは良いアプローチですが、Spring MVCはそれをさらに簡単にします- HandlerInterceptor は、リクエストが処理されるたびに前後に呼び出されます。 HandlerInterceptor postHandleメソッド(HandlerInterceptorインターフェースを実装するクラス内)で、ModelAndViewにデータを追加できます。構成ファイルでインターセプトするハンドラーを定義します。
他のヒント
アスペクトの使用方法をご覧ください。 Springには、使用できる AOP 拡張機能もあります。 。
簡単に言えば、アスペクトを使用すると、コードを一度定義すると、「織られた」コードが得られます。クラスをコンパイルするとき、またはクラスローダーによってロードされるときに、クラスに追加します。これは比較的高度なものであり、新しいプログラマーにとって最も直感的なものではありませんが、参照している問題を正確に解決することを目的としています。
間違っているかもしれませんが、要件を誤って説明している可能性があります。
「すべてのコントローラーについて、特定のデータをモデルに追加したい」と言っているようです。
「すべてのビューで特定のデータを使用できるようにする」ことを意味すると思われます。
疑念が正しければ、モデルにデータを追加すると、モデルが汚染され、単一責任の原則に違反することになります。これは、同じデータを複数のモデルに追加する場合に特に当てはまります。モデルをデータの便利な「キャリア」として使用しているだけではないことに注意してください-データは実際にはモデルとは関係ありません。
確かに、私はSpring MVCの物事のやり方に完全には精通していませんが、あなたが達成しようとしているもののより詳細な例は、より多くの情報に基づいた議論を可能にするかもしれません。