19

Guiceが、コードで独自のバインディングを実行して独自のモジュールを手動で作成する方法が気に入っています。一方、CDIは、sestバインディングへのプログラムによるアクセスではなく、魔法に依存しているようです。私は間違っていますか、またはWELDで同じ効果をどのように達成できますか?

コードサンプルをいただければ幸いです...

明確化

http://code.google.com/p/google-guice/でGuiceによって提供されたビルダーパターンスタイルを使用して、プログラムでモジュール(Guice用語申し訳ありませんがCDI用語がわかりません)を構築したいと思っていました。

私は動的システムを構築していますが、Weldがクラスパスなどを動的にスキャンして型を見つけて登録するのではなく、型(インターフェイスなど)や定数などをバインドできるようにする必要があります。CDIは静的であると思います。javax.injectパッケージには、プログラムで型を実装にバインドできるインターフェースは含まれていません。

明確化パート2

元の質問の基本的な前提は、注釈が焼き付けられており、イネクターを支援するために注釈に定義されているルールを変更できないという単純な観察でした。私は当初、CDIクラスパススキャナーが内部使用の定義を構築するために使用するのと同じインターフェイスへのパブリックアクセスを望んでいました。基本的には、アノテーションを読み取ってコンテナーの定義を作成できるレイヤーが必要です。デフォルトのプロバイダーは、現在行われていることを実行するプロバイダーである可能性がありますが、他の戦略が必要な場合は、これを実行する可能性があります。

現在のアプローチの問題の1つは、異なるアノテーションを持つコンポーネント(クラス)を再利用して異なるコラボレーターを選択できないという制限です。ジャンプする前に、このステートメントを修飾させてください。そうです、プロバイダーなどで実行できますが、これにより、より多くのアーティファクトが発生します。もっと簡単な方法があるはずです。

例1

この例が不十分な場合は申し訳ありませんが、私のユースケースははるかに複雑であり、詳細が邪魔になり、はるかに長く読むことができます。

引数のために次のようないくつかのパラメータを持つURL書き換えコンポーネントがあると想像してください

  • このパターンをそのパターンに置き換えます。
  • 多分htmlクリーナー

この同じコンポーネントに2つの異なる置換ルールを注入したいが、htmlクリーナーインジェクターを使用したい場合は、行き詰まります。確かにこれを回避する方法はありますが、もちろんより多くのコードであるアーティファクトが必要です。

残念ながら、すべてのバインディングルールはインスタンスではなくクラスにあるため、クラスを要求するたびに、機能的に同等のインスタンスが返されます。

溶接

この質問は少し前に書かれたもので、Weldをあきらめました。魔法がどのように行われるかを指示する方法は間違っていると思います。いつ、どのようにこのアクションを繰り返したいかを制御する方法を提供せずに、これがどのように発生するかを彼らが私に指示するという事実は好きではありません。私はこの柔軟性の欠如が好きではありません。

4

1 に答える 1

8

Guice と CDI/Seam2 を定期的に使用しています。短い答えはnoです。CDI はプログラムによる Bean 定義 (Guice が呼ぶところの「バインディング」) をサポートしていません。

CDI は、コンテナーが Bean 定義を自動的にスキャンする宣言型アプローチを使用します。これは、「代替」機能を使用してある程度カスタマイズできますが、Guice のプログラムによるアプローチ (基本的に何でもできる) ほど柔軟ではありません。


私の2セント

私は両方のフレームワークを使用しています。「低レベル」の非エンタープライズ POJO コンポーネント (CDI 機能を持っていない/必要としない場合) には Guice、CDI の追加機能が必要な場合には CDI、JSF または EJB3 にプラグインされるものには CDI を使用します。主に、アプリケーション サーバー クラスタの外側で実行される「アダプタ」JVM で DI を取得する方法として、Guice を使い始めました。CDI に慣れるにつれて、Guice の必要性が少なくなってきています。CDI が「管理されていない」インスタンスをサポートする場合、Guice を CDI に置き換えることができると思います (例、weld-se)。

RE: Weld 'magic' - IMO Bean 定義のスキャンに関する「魔法」は何もありません。これは CDI 仕様で非常に明確に定義されており、JPA や EJB3 などの他の Java Enterprise フレームワークに似ています。

私のアドバイスは次のとおりです。

  1. あなたに合ったものを使用してください。CDI が気に入らない場合は、使用しないでください。たとえば、アプリで「管理されていないインスタンス」が必要なので、そのために Guice を使用します。
  2. CDI の方が優れていると思われる場合は (私はそう思います)、参加してください。CDI を定義するコミュニティに参加してください。
于 2011-07-28T12:17:19.200 に答える