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を使えばかなり簡単です。
質問に答える前に、重要な情報を追加します。 JSR 3 (@Inject
)はGuiceおよびSpringプロジェクトによって標準化され( 2009年5月からの発表 )、現在 JSR 299で再利用されています です。これは、注入ポイントを宣言するという観点からの基本的なDIメカニズムをカバーしています。
さて、質問に戻りましょう-免責事項で、私はGuiceよりもSpringではるかに多くの経験を持っています。
Weldのエンタープライズ機能
beans.xml
)。長所/短所
注:後でいくつかの項目を追加しようとしますが、この回答は予想よりも長くなっています。申し訳ありません。
溶接/ CDI
Guice/Spring
AOPとインターセプター
これは非常に頻繁に議論されるトピックであり、私はどちらか一方を優先することはできません。どちらのメカニズムも非常に強力ですが、アプリケーションのアーキテクチャについて少なくとも理解しておく必要があります。 Decorators および以前に参照された Events も参照してください。適切なツールを使用することをお勧めしますが、開発者がこれらのメカニズムのいずれかを使用する必要がある場合は、その概念を理解していることをお勧めします。
パフォーマンス
残念ながらまだこれを調べることはできませんでしたが、特に気付かずに多くの機能を提供するフレームワークを使用している場合は、従うべきいくつかのルールがあります。
CDI(溶接)はまだ広く使用されていないため、比較は困難です。いくつかのポイント:
Guiceユーザー向けのCDI は素晴らしい比較です。
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}"/>
AWS LambdaサーバーレスアプリケーションでGuiceを使用しました。 AWSでは、Lambda関数でSpringを介してGuiceまたはDaggerを使用することをお勧めします。 AWS Lambdaのベストプラクティスを参照してください
主な理由は、GuiceとDaggerはフレームワークが小さく、起動時間が速いことです。これはLambdaに不可欠です。
OPはSpringについて言及していませんが、SpringとCDI/weldの両方は、これらのフレームワークが提供する追加機能を必要とすることが多いエンタープライズレベルのアプリケーションを対象としています。したがって、DIのみを必要とする小規模なアプリケーションでは、GuiceまたはDaggerが最適です。