web-dev-qa-db-ja.com

Google Guice対JSR-299 CDI /溶接

JSR-299 Contexts and Dependency Injectionのリファレンス実装であるWeldは、Spring and Guiceの後継の一種と見なされています。

CDIは、既存のJavaフレームワーク(Seam、Guice、Springを含む)の影響を受けました。ただし、CDIには独自の特徴があり、Seamよりもタイプセーフで、ステートフルでXMLが少ないという特徴があります。 Springよりも中心的で、GuiceよりもWebおよびエンタープライズアプリケーションに対応していますが、前述のフレームワークや、JSR-299エキスパートグループ(EG)による多くのコラボレーションとハードワークからのインスピレーションがなければ、これらはあり得ませんでした。

http://docs.jboss.org/weld/reference/latest/en-US/html/1.html

WeiceがGuiceと比較してエンタープライズアプリケーションに対してより優れている理由は何ですか? Guiceと比較して利点または欠点はありますか?溶接インターセプターと比較してGuice AOPについてどう思いますか?パフォーマンスはどうですか?

私の選択

最終的に、デフォルトで@Inject以外にほとんど注釈が付いていないクリーンなプログラミングモデルが好きなため、Guiceを使用することにしました。 CDIよりもGuiceで外部ライブラリを使用する方がはるかに簡単です。 AOPもGuiceを使えばかなり簡単です。

58
deamon

質問に答える前に、重要な情報を追加します。 JSR 3@Inject)はGuiceおよびSpringプロジェクトによって標準化され( 2009年5月からの発表 )、現在 JSR 299で再利用されています です。これは、注入ポイントを宣言するという観点からの基本的なDIメカニズムをカバーしています。

さて、質問に戻りましょう-免責事項で、私はGuiceよりもSpringではるかに多くの経験を持っています。

Weldのエンタープライズ機能

  • 代替構成メカニズム はJSR-299で非常にクリーンな設計になっており、Javaコード(beans.xml)。
  • Events は非常に強力な機能であり、JMSにうまく適合します。 Guiceのイベントバス を見つけましたが、比較することはできません。
  • ポータブル拡張機能 は、SPI=であり、既存のテクノロジーと統合したり、従来のコードをクリーンな方法でラップしたりするために使用できます。

長所/短所

注:後でいくつかの項目を追加しようとしますが、この回答は予想よりも長くなっています。申し訳ありません。

  • 溶接/ CDI

    • 標準化:何かが標準化され、適切な実装がある場合、多くの人々がそれを使用します。例: ビルトインスコープ Weldでは、 Guice または Spring よりもいくつかのスコープが提供されます。これらはすべて拡張できますが、大規模なコミュニティで使用されている場合、アプリケーションフレームワークは標準スコープに依存します。
    • コンテナのサポート:これは前の項目に似ていますが、採用の主要な議論です。 GlassfishやJBoss 6などの主要なオープンソースアプリケーションサーバーは、CDIサポートを提供します( こちら を参照)。
  • Guice/Spring

    • 実際のアプリケーション:既存のアプリケーションのほとんどは、すでにGuice/Springを使用しています。 Spring/Guiceは常に標準に基づいて構築されており、標準が存在しないか使用できない新しい機能を提供してきました。それぞれのベストプラクティスに従っている場合、フレームワークはアプリケーションを標準ベースでクリーンなものにするのに役立ちます。

AOPとインターセプター

これは非常に頻繁に議論されるトピックであり、私はどちらか一方を優先することはできません。どちらのメカニズムも非常に強力ですが、アプリケーションのアーキテクチャについて少なくとも理解しておく必要があります。 Decorators および以前に参照された Events も参照してください。適切なツールを使用することをお勧めしますが、開発者がこれらのメカニズムのいずれかを使用する必要がある場合は、その概念を理解していることをお勧めします。

パフォーマンス

残念ながらまだこれを調べることはできませんでしたが、特に気付かずに多くの機能を提供するフレームワークを使用している場合は、従うべきいくつかのルールがあります。

  • 可能な限り、実行時の複数のルックアップよりも単一の配線ステップを優先してください。
  • 可能であれば、アプリケーションの初期化時にすべての配線を行います。
  • インターセプトステップまたはAOPプロキシは、いくつかのメソッド呼び出しをスタックに追加します。
53
Kariem

CDI(溶接)はまだ広く使用されていないため、比較は困難です。いくつかのポイント:

  • CDIは、EJB3、JSF、およびその他のJavaEE標準との統合を考慮して設計されています。 CDIにはいわゆるポータブル拡張機能があり、サードパーティのライブラリをCDI実装のライフサイクルおよび内部機能と統合できます。
  • CDIは可能な限りすべてのケースを考慮して設計されているため、必要なすべてをカバーしている可能性があります。 Spring、Guice、Seamはこのような状態に進化しましたが、CDIはこれら3つの経験を使用しています。
  • 私の意見では、CDIインターセプターは、Spring AOPが満たしたすべての要求を満たすことができません。おそらく同じことがGuice AOPにも当てはまります。 AspectJ構文を使用してインターセプターを定義することはできません。
  • xML定義の欠如は長所と短所の両方であり、一部の人々は(場合によっては正しく)xml構成を好みます。
  • 修飾子アノテーションを拡張して使用すると、(私の意見では)注意深く使用しないと、大きな混乱が発生します。
19
Bozho

Guiceユーザー向けのCDI は素晴らしい比較です。

9
deamon

CDIがGuiceに反対した最も重要な機能は、それが標準 Java EE 6の一部であることです。

これは、CDIがWebアプリケーションのコーディング時に使用する必要があるDI標準であることを意味するため、過小評価することはできません。

しばらく前に、標準のコアディストリビューション(適切に準備された)をどのようにして決定できるかを確認しました。コアモジュールを変更せずに既存の機能をオーバーライドできる追加のモジュールを自由に追加できます。つまりjarを追加すると、機能が自動的にアクティブになります。

デスクトップアプリケーションとWebアプリケーションの両方で使用されるコードベースでこれを行うための最良の方法は、JSR-330アノテーションをコードに使用し、CDIまたはGuice(SVN、すぐに現実になる予定)を使用することでした。 3.0)エンジンとして。

いくつかのプロジェクトを行った後、Weldで発生する不透明な魔法の代わりに、Guiceの設定が最も好きであることがわかりました。さらに、Weldを使用して上記のようにしたい方法を実行する方法を見つけました。追加のjarのクラスを@Alternativeとしてマークし、beans.xmlで代替クラスを強制することを言及する必要があります(これはリファクタリングに対して堅牢)。

しかし、全体として、JSR-330を使用すると、以前は非常に面倒で壊れやすい処理を行うことができます(newは非常に緊密にバインドされるため)。これは大きな勝利です。このような必要がある場合は、DIを検討することを強くお勧めします。

別の差別化要因は、CDIが非常にJava EE指向であることです。これは接着剤異なるJava EEサブシステムを一緒にするメカニズムを提供します。

つまり。 Beanに@Named("book")の注釈を付けると、Beanは統合されたEL(式言語)では 'book'として認識されます。

次に、たとえばJSFページで使用できます。

    <h:outputLabel value="Book title:" for="bookTitle"/>
    <h:outputText id="bookTile" value="#{book.title}"/>
5
Jan

AWS LambdaサーバーレスアプリケーションでGuiceを使用しました。 AWSでは、Lambda関数でSpringを介してGuiceまたはDaggerを使用することをお勧めします。 AWS Lambdaのベストプラクティスを参照してください

主な理由は、GuiceとDaggerはフレームワークが小さく、起動時間が速いことです。これはLambdaに不可欠です。

OPはSpringについて言及していませんが、SpringとCDI/weldの両方は、これらのフレームワークが提供する追加機能を必要とすることが多いエンタープライズレベルのアプリケーションを対象としています。したがって、DIのみを必要とする小規模なアプリケーションでは、GuiceまたはDaggerが最適です。

2
beni_koch