26

私は、Spring を DI/Bean 管理に使用する非常に大規模な JSF/Facelets アプリケーションを使用しています。私のアプリケーションにはモジュール構造があり、現在、モジュール化を標準化する方法を探しています。

私の目標は、多数のモジュール (相互に依存している可能性があります) から Web アプリケーションを作成することです。各モジュールには、次のものが含まれる場合があります。

  • クラス;
  • 静的リソース (画像、CSS、スクリプト);
  • Facelet テンプレート;
  • マネージド Bean - リクエスト、セッション、およびアプリケーション スコープの Bean を使用した Spring アプリケーション コンテキスト (代替は JSF マネージド Bean)。
  • サーブレット API のもの - サーブレット、フィルター、リスナー (これはオプションです)。

私が (ほとんどすべての犠牲を払って) 回避したいのは、モジュール リソース (Facelets テンプレートなど) を WAR にコピーまたは抽出する必要があること、またはweb.xmlモジュールのサーブレット、フィルターなどを拡張する必要があることです。モジュールを追加するだけで十分なはずです。 (JAR、バンドル、アーティファクト、...) を Web アプリケーション ( WEB-INF/libbundlesplugins、...) に接続して、このモジュールで Web アプリケーションを拡張します。

現在、クラスパスリソースの使用に大きく基づいたカスタムモジュール化ソリューションでこのタスクを解決しています。

  • 特別なリソース サーブレットは、クラスパス リソース (JAR) から静的リソースを提供します。
  • 特別な Facelets リソース リゾルバーにより、Facelet テンプレートをクラスパス リソースからロードできます。
  • Spring はパターンを介してアプリケーション コンテキストを classpath*:com/acme/foo/module/applicationContext.xmlロードします。これにより、モジュール JAR で定義されたアプリケーション コンテキストがロードされます。
  • 最後に、委任サーブレットとフィルターのペアは、モジュールから Spring アプリケーション コンテキストで構成されたサーブレットとフィルターに要求処理を委任します。

最近、私は OSGi について多くのことを読み、標準化されたモジュール化アプローチとして OSGi を使用する方法 (および使用する場合) を検討していました。OSGi で個々のタスクをどのように解決できるかを考えていました。

  • 静的リソース - 静的リソースをエクスポートする OSGi バンドルは、ResourceLoaderインスタンスをバンドル コンテキストに登録します。セントラルResourceServletは、これらのリソース ローダーを使用して、バンドルからリソースをロードします。
  • Facelet テンプレート - 上記と同様に、セントラルResourceResolverはバンドルによって登録されたサービスを使用します。
  • マネージド Bean -バンドルの 1 つで定義されている場合のような式の使用方法がわかりません。#{myBean.property}myBean
  • サーブレット API のもの - WebExtender/Pax Web などを使用して、サーブレット、フィルターなどを登録します。

私の質問は次のとおりです。

  • 私はここで自転車を発明していますか?そのための標準的なソリューションはありますか?Spring Slices についての言及を見つけましたが、それに関するドキュメントはあまり見つかりませんでした。
  • OSGi は、説明されているタスクに適したテクノロジーだと思いますか?
  • OSGI アプリケーションの私のスケッチは多かれ少なかれ正しいですか?
  • マネージド Bean (特にリクエスト/セッション スコープ) をどのように処理する必要がありますか?

私は一般的にあなたのコメントに感謝します.

4

5 に答える 5

13

いくつかの注意点がありますが、あなたが目指していることは実行可能に聞こえます。

ビューレイヤー:まず、ビューレイヤーは少し詰め込みすぎに聞こえます。カスタムコンポーネントを使用してJSFコンポーネントをモジュール化する方法は他にもあります。これにより、遅延バインディングのマネージドBeanのように劇的なものを作成しようとする際の頭痛の種を回避できます。

モジュール自体:次に、モジュールは特にモジュール式ではないようです。最初の箇条書きリストは、モジュール自体ではなく、相互運用可能なWebアプリを作成しようとしているように聞こえます。モジュールについての私の考えは、各コンポーネントには明確に定義された、多かれ少なかれ個別の目的があるということです。exがviの根底にあるように。OSGiルートを進む場合は、次のようにモジュラーを定義する必要があります。モジュラーとは、この説明のために、コンポーネントがホットスワップ可能であることを意味します。つまり、アプリを壊すことなくコンポーネントを追加および削除できます。

依存関係:モジュールが「相互に依存している可能性がある」と説明されていることに少し懸念があります。あなたはおそらく(私は)すでにこれを知っているでしょうが、あなたの依存関係は有向非巡回グラフを形成するはずです。循環依存を導入すると、アプリの最終的な保守性の観点から、傷ついた世界を求めていることになります。OSGiの最大の弱点の1つは、循環依存を妨げないことです。したがって、これを強制するのはあなた次第です。そうしないと、依存関係がkudzuのように成長し、システムの残りのエコシステムを徐々に窒息させてしまいます。

サーブレット: Fuhgeddaboudit。サーブレット3.0仕様が本番環境に移行するまで(Pascalが指摘したように)、サーブレットをWebアプリに遅延バインディングすることはできません。別のユーティリティサーブレットを起動するには、それを独自のアプリに配置する必要があります。


OK、警告についてはこれだけです。これがどのように機能するかを考えてみましょう。

実行する独自のJSFモジュールを定義しました...正確には何ですか?定義された、かなり些細な目的、つまりログイン画面を与えましょう。それで、ログイン画面を作成し、OSGiを使用してアプリにレイトバインドしてから...それではどうしますか?.jspxページでログイン機能を定義していない場合、アプリはログイン機能が存在することをどのように認識しますか?アプリは、そこにあることがわからないものにナビゲートすることをどのように知っていますか?

条件付きインクルードなどを使用してこれを回避する方法はありますが(たとえば<c:if #{loginBean.notEmpty}>)、あなたが言ったように、マネージドloginBeanがまだアプリに導入されていない可能性のある別のモジュールに存在する場合は少し厄介になります。実際、loginBeanが存在しない限り、サーブレット例外が発生します。それで、あなたは何をしますか?

モジュールの1つでAPIを定義します。モジュール間で共有する予定のすべてのマネージドBeanは、このAPIレイヤーのインターフェースとして指定する必要があります。また、すべてのモジュールには、使用する予定のこれらのインターフェイスのいずれかのデフォルトの実装が必要です。また、このAPIは、相互運用可能なすべてのモジュール間で共有する必要があります。次に、OSGiとSpringを使用して、指定されたBeanをそれらの実装と結び付けることができます。

これは私がこの問題に取り組む方法ではないことを指摘するために少し時間をとる必要があります。全くない。ログインページのように単純なもの、または株価チャートのように複雑なものを考えると、私は個人的にカスタムJSFコンポーネントを作成することを好みます。ただし、要件が「マネージドBeanをモジュール化(つまり、ホットスワップ可能)にする」である場合、これが機能するための唯一の方法です。そして、私はそれがうまくいくかどうかさえ完全には確信していませこの電子メール交換は、JSF開発者が取り組み始めたばかりの問題であることを示唆しています。

私は通常、マネージドBeanをビューレイヤーの一部と見なしているため、ビューロジックにのみ使用し、その他はすべてサービスレイヤーに委任します。マネージドBeanを遅延バインディングにすることは、私の考えでは、それらをビューレイヤーからビジネスロジックに昇格させることです。これらのチュートリアルがすべてサービスに重点を置いているのには理由があります。ほとんどの場合、アプリが「ヘッドレス」で実行されるのに何が必要か、そして次の場合にビューを「スキン」するのがどれほど簡単かを検討したいからです。たとえば、Androidスマートフォンで、すべての機能を使用して実行する必要があります。

しかし、作業しているものの多くはそれ自体がビューロジックであるように思えます。たとえば、別のビューテンプレートに交換する必要があります。OSGi / Springが役立つはずですが、利用可能な実装から選択するには、アプリに何かが必要です。OSGiのサービスレジストリが実行するために構築されたものとほぼ同じです。

それは静的なリソースを残します。これらをモジュール化することはできますが、これらのリソースを取得するためのインターフェースを定義する必要があります。また、リソースがない場合にアプリがチョークしないように、デフォルトの実装を提供する必要があります。i18nを検討する場合、これは良い方法かもしれません。本当に冒険したい場合は、静的リソースをJNDIにプッシュできます。これにより、完全にホットスワップ可能になり、プログラムで使用する実装を解決しようとする手間が省けますが、いくつかの欠点があります。ルックアップに失敗すると、アプリがNamingExceptionをスローします。そしてそれはやり過ぎです。JNDIは通常、アプリ構成のためにWebアプリで使用されます。

残りの質問について:

ここで自転車を発明していますか?そのための標準的な解決策はありますか?

あなたは、少しです。この種のことを行うアプリを見たことがありますが、あなたはかなりユニークな一連の要件に遭遇したようです。

OSGiは、説明されているタスクに適したテクノロジーだと思いますか?

モジュールをホットスワップ可能にする必要がある場合は、OSGiと軽量のServiceLocatorインターフェースを選択できます。

OSGIアプリケーションのスケッチは多かれ少なかれ正しいですか?

コンポーネントの境界がどこにあるかをもっと知らなければ、私は本当にわかりません。現時点では、OSGiが実行できる以上のことを実行するようにプッシュしているようです。

しかし、私の言葉を信じないでください。私はこれらの場所で 他の読み物を見つけました。

そして、あなたは春のスライスについて尋ねるので、これはあなたが始めるのに十分なはずです。Gitクライアントが必要です。ソースコードを調べて、アプリのトレーニングをしているようです。そして、それは非常に初期のプロトタイプコードです。

于 2010-04-13T16:18:10.517 に答える
3

現在のプロジェクトでも同じ問題に直面しています。私の意見では、OSGiは標準と将来のサポートの点で最良で最もクリーンなソリューションですが、現在Webアプリケーションで使用しようとすると、いくつかの問題が発生する可能性があります。

  1. WebコンテナとOSGiプラットフォームの間に十分に統合されたソリューションはまだありません。
  2. OSGiは、単純なモジュール化されたアーキテクチャーを探しているだけのカスタムビルドWebアプリケーションには多すぎるかもしれません。プロジェクトが100%制御されていないサードパーティの拡張機能をサポートする必要がある場合、プロジェクトがホットな再デプロイ、プラグイン間の厳密なアクセスルールなどを必要とする場合は、OSGiを検討します。

クラスローダーとリソースフィルターに基づくカスタムソリューションは、私には非常に適しているようです。例として、 HudsonソースコードまたはJavaプラグインフレームワーク(JPF)プロジェクト(http://jpf.sourceforge.net/)を調べることができます。

web.xmlの拡張については、サーブレット3.0仕様(http://today.java.net/pub/a/today/2008/10/14/introduction-to-servlet-3.html#)で幸運かもしれません。プラグ可能性と拡張性)。

于 2010-11-22T10:35:42.243 に答える
2

ここでは、サーブレット 3.0 仕様で導入された「Web モジュール デプロイメント記述子フラグメント」(別名 web-fragment.xml)が便利です。仕様では、次のように定義されています。

Web フラグメントは、開発者に web.xml の情報の編集や追加を依頼することなく、Web アプリ内で使用されているフレームワークがすべての成果物を定義できるようにする、Web アプリの論理的な分割です。

ただし、Java EE 6 は現時点では選択肢にならないかもしれません。それでも、それは標準化されたソリューションになるでしょう。

于 2010-04-09T21:53:22.680 に答える
1

エンタープライズ OSGi はかなり新しいドメインであるため、ニーズを直接満たすソリューションが得られるとは思わないでください。つまり、私が Equinox に欠けていると感じたものの 1 つ (Eclipse の背後にある osgi エンジン、したがって最大のユーザー ベースを備えたエンジンです!) は、一貫した構成/DI サービスです。最近の私のプロジェクトでは、同様のニーズがいくつかあり、単純な構成の osgi サービスの構築を終了しました。

モジュールの可視性が場合によってはクラスへのアクセスを妨げる可能性があるため、モジュラー アプリケーションに固有の問題の 1 つは DI に関するものです。私たちは登録バディポリシーを使用してこれを回避しました。これはあまり理想的ではありませんが、機能します。

構成以外に、モジュラー アプリケーションを作成するためのベースとして OSGi を使用するためのガイダンスとして、最近リリースされた Equinox の書籍を参照できます。例は Equinox に固有のものかもしれませんが、原則はどの OSGi フレームワークでも機能します。リンク - http://equinoxosgi.org/

于 2010-04-09T21:22:45.683 に答える
0

Spring DM Server を調べる必要があります (Eclipse Virgo に移行中ですが、まだリリースされていません)。同じくリリースされたばかりの最近の OSGi エンタープライズ仕様には、多くの優れた点があります。

Spring DM チュートリアルのいくつかが役立つと思います。ただし、標準のモジュール性を使用して、リソースとクラスの両方を Web バンドルの外部からロードすることは可能です。その中で、それはぴったりです。

セッションコンテキストについては、セッションで期待どおりに処理されます。ただし、Web バンドル間でそのセッションを共有すると、それが可能かどうかさえわからないという問題が発生する可能性があります。

また、単一の Web バンドルを用意し、Eclipse 拡張レジストリーなどを使用して Web アプリの機能を拡張することもできます。

于 2010-04-04T20:04:19.057 に答える