[解決済み] SpringとDaggerがあるのに、なぜGuiceを使う/開発するのですか?[クローズド]です。
質問
私の知る限り、Daggerはコードを生成しますが、GuiceとSpringは実行時処理に依存します。したがって、Daggerは速く動作しますが、プログラマー側の作業がより多く必要です。そのため、Daggerは高速に動作しますが、プログラマー側の作業が増えます。パフォーマンス面で優れているため、モバイル(Android)開発に向いています。
しかし、GuiceとSpringになったとき、後者にはたくさんの統合があります。Spring Framework(基本的に同じことをするが、より簡単なデータベースアクセスなどを提供する)を使えるなら、Guiceを開発/使用する意味はあるのでしょうか?
Googleは、Spring Frameworkを使う(そしておそらく貢献する)代わりに、独自のDIツールを作ることで車輪の再発明をしようとしているのではないでしょうか?
DIツールを選択する際のガイドとなるようなデシジョンツリーを探しています。
どのように解決するのですか?
DaggerはGuiceの後に、Guiceのクリエイターの一人が作ったものであることを認識しておく必要があります( クレイジー・ボブ" リー スクウェアに移籍していた)。
- Springは、もともと 2002年10月 .
- GoogleがGuiceを一般に公開したのは 2007年3月 .
-
JSR-330
形式的
javax.inject
のアノテーションは 2009年10月 Google (Bob Lee)、Spring、その他業界関係者の多大なるご協力を得ています。 - スクウェアがDagger 1を一般に公開したのは 2013年5月 .
- GoogleがDagger 2を一般に公開したのは、もともと 2015年4月 .
- Squareは、この質問がなされる10日前に、Dagger 1を非推奨とマークしています。 2016年9月15日(金 .
その意味で、Guiceの継続的な管理は車輪の再発明ではなく、Daggerのどのバージョンよりもずっと前からある、長期間にわたって広く消費されているソフトウェアパッケージのメンテナンスなのです。DaggerはGuiceの精神的後継者であると考えることもできますが、Guiceが提供しているのは 最適化されたサブセット Guiceの機能の
上記にある相違点を列挙し、修正すること。
- Springは、多くの統合、XML設定言語、ランタイム/リフレクティブバインディングを持つ比較的ヘビーウェイトなフレームワークです。すでにSpringを使用しているアプリケーションは、Springの依存性注入フレームワークをほとんど追加作業なしで使用できる。
- Guiceは比較的軽量なフレームワークで、統合、Javaインスタンス設定、ランタイム/リフレクティブバインディングの数が少ないのが特徴です。Javaバインディングを使用することで、コンパイル時の型チェックとIDEオートコンプリートの統合を得ることができます。
- Daggerは非常に軽量なフレームワークで、統合機能はほとんどなく、Javaインターフェース/アノテーションの設定、コンパイル時に生成されるコードバインディングを備えています。コード生成の側面から、Daggerは全体的に、特にリソースが限られたモバイル環境において非常に高いパフォーマンスを発揮します。(AndroidのVMはリフレクションが特に遅くなる点でサーバーJREと異なるため、Daggerはここで特に役に立ちます)。
- 上記の3つのフレームワークはすべてJSR-330をサポートしているので、うまく作られたライブラリやアプリケーションは、使用するDIコンテナにほとんど左右されないことができます。
さらに、使用するフレームワークの保守・廃止のパターンやポリシーに目を向けてください。あなたのチームの知識と経験、リフレクションや実行時設定の必要性、統合や実行時パフォーマンスの必要性に基づいて、おそらく上記のうちの1つが際立って見えることでしょう。とはいえ、他のフレームワークも存在するので、新しい選択肢や上記のフォークにも目を向けてください。
関連
-
[解決済み] XX:MaxDirectMemorySizeの既定値
-
[解決済み] Eclipse- Dynamic Web Module 3.0 で新しいプロジェクトを作成するときに Java 1.6 以降が必要なエラーが発生する。
-
[解決済み] どのように配列の10未満の値(x * 2)を倍増するコードを取得するには?(Java)
-
[解決済み] Javaコンパイラーエラー:ステートメントではありません
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] なぜゲッターとセッター/アクセッサーを使うのですか?
-
[解決済み] ThreadLocal変数はいつ、どのように使用すればよいですか?
-
[解決済み] Spring Frameworkの@Injectと@Autowiredの違いは何ですか?どのような条件でどちらを使うか?
-
[解決済み] Javaの@Overrideアノテーションはいつ使うのか、なぜ使うのか?
-
[解決済み】Spring Bootで2つのDataSourceを構成して使用する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] java.sql.SQLException: ORA-00933: SQL コマンドが正しく終了していません。
-
[解決済み] Jdbctemplate の文字列に対するクエリです。EmptyResultDataAccessException: 不正な結果サイズ:期待値1、実際0
-
[解決済み] 環境変数JAVA_OPTSの使い方を教えてください。
-
[解決済み] Java Genericメソッドをstaticにするには?
-
[解決済み] double 型を Int 型に変換、切り捨て
-
[解決済み] 要素 'beans' の宣言が見つかりません。
-
[解決済み] javascriptでExpression言語を使うには?
-
[解決済み] JavaにおけるMouseListenerとMouseAdapterの違いについて
-
[解決済み] 文字列が一意な文字であるかどうかを判定する
-
[解決済み] java.io.IOException。DER長の短い読み取り