AndroidアプリのDependency Injection(DI)フレームワークを評価しています。上位の候補は、ダガー(バターナイフ付き)およびAndroidアノテーションです。 DaggerとButterKnifeは同じソーススクエアからのものであり、互いに補完し合うことを理解しています。私が探している主要なマトリックスは次のとおりです。
AndroidAnnotations
コンパイル時の注釈処理を使用します。元の名前にアンダースコアを付けたサブクラスを生成します(MyActivity_
はMyActivity
から生成されます。そのため、元のクラスではなく、生成されたクラスを参照用に常に使用する必要があります。
非常に豊富な機能セットがあります。 使用可能な注釈のリスト を参照してください。
バターナイフ
コンパイル時の注釈処理も使用しますが、中央クラス(ButterKnife
)が使用するFinderクラスを生成します。つまり、参照には元のクラスを使用できますが、手動でインジェクションを呼び出す必要があります。 ButterKnifeの紹介からのコピー:
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
ButterKnife.inject(this);
// TODO Use "injected" views...
}
機能セットはそれほど豊富ではなく、ButterKnifeはビューインジェクションをサポートします(AndroidAnnotationsに相当するものは@ViewById
and @ViewsById
)およびいくつかのイベントバインディング(完全なリストについては、ネームスペースディレクトリ here を参照してください。OnXXX
イベントアノテーションをカウントしてください)。
短剣
は、Guiceに似たAndroidのDI実装です。また、コンパイル時の注釈処理を使用し、手動注入に使用するオブジェクトグラフを生成します。たとえば、アプリケーションオブジェクトグラフとスコープオブジェクトグラフを区別して注入します。活動中。ここには、Application.onCreate
例:
@Override public void onCreate() {
super.onCreate();
objectGraph = ObjectGraph.create(getModules().toArray());
objectGraph.inject(this);
// use injected classes
}
短剣から始めるのは難しいことがわかりましたが、これは私の経験にすぎないかもしれません。ただし、より良いスタートのためにいくつかのビデオを参照してください: 1 、 2
機能セットの観点から言えば、DaggerはAndroidAnnotationの@EBean
および@Bean
機能。
概要
使いやすさ、テストのサポート、パフォーマンスを比較する場合、AndroidAnnotationとButterKnife + Daggerの使用に大きな違いはありません。違いはプログラミングモデルにあります(_
元のものを使用する代わりに、手動でインジェクションを呼び出す)および機能セット内。
AndroidAnnotationは機能の完全なリストを提供しますが、特定のライブラリに結び付けます。たとえば、残りのAPIを使用する場合は、Spring Androidを使用する必要があります。また、OrmLite(@OrmLiteDao
)OrmLiteを使用するかどうかに関係なく。
最後に、少なくとも私の意見では、それは好みの問題です。
Dzone blog の素敵な記事をご覧ください。
次のようなそれぞれの機能を比較する必要があります。
- 最小ジャー
- ActionBarSherlockの互換性
- クリックリスナーのインジェクション
- POJOインジェクション
- 性能
バターナイフに欠けているのはポージョ注射だけです!バターナイフが勝者のようです!
Googleは、依存性注入を使用しないように特に求めています。
しかし、彼らのリクエストを読むことで、彼らはGuice
とリフレクションベースのDIライブラリをもっと参照しているように見えます。 Android注釈などのライブラリは、コンパイル時に生成されたコードを使用する代わりにリフレクションを使用しませんが、butterknife
およびdagger
はAndroidしかし、おそらくAndroid annotation
。それは、プロジェクトと、どれだけのパフォーマンスヒットを許容するかにかかっています。私の意見では、butterknife
を使用するだけで、コード開発自体を高速化するのに十分です。さらに少し必要な場合は、Android annotation
そして最後に、リフレクションによるわずかなパフォーマンスヒットを望んでいる場合は、強力なGuice
ベースのリフレクションでパフォーマンスを完全に破壊することなく最適なオプションを使用しますdagger
+ butterknife
を使用します。
Toothpick で試してみてください。
つまようじは(READMEによる):
ほとんどの場合、Dagger 2よりも高速であり、はるかに簡単です。
注:はい、私は著者の1人です。
Android AnnotationsまたはButterknifeを使用して、コーディングを容易にします。しかし、Roboguiceには向かないでください!Roboguiceは、アクティビティ、フラグメントをroboguiceクラスに拡張します。
ダガー2は、はるかに優れたオプションです。必要に応じてAndroid Annotationsと一緒に使用できます。シンプルなアプリにはAndroid Annotationsを使用しますが、最近はうまく機能していますダガーでもっと。
@ -ChrLippが言及した reddit-thread には、同じプロジェクトで3つすべてを使用した誰かがいます。 AndroidAnnotationsにも場所を与えます:
依存性注入では、ビューにバターナイフが使用され、すべてのオブジェクトにダガーが使用され、強く推奨されます。Androidアノテーションは、代わりにAndroid DaggerはGuiceと同等ですが、はるかに高速です。DaggerはButterKnifeよりも強力で、すべてのオブジェクトを注入する際のAndroidアノテーションButterKnifeとAndroidではなく、特定のオブジェクトセットのみを挿入するアノテーション。
Daggerはセットアップと構成に苦労する可能性がありますが、一度実行すると価値があります。しかし、これらはすべて互いに非常に異なるため、プロジェクトのニーズに依存します。
また、それぞれがまったく異なると言えば、プロジェクトでButterKnife、Android AnnotationsとDaggerをすべて同じプロジェクトで使用することができます。それらをすべて使用できるように、何か異なるものがあります。
彼らはSquareと共同で開発している のように、Googleは短剣を選択しているようです。
ButterknifeとDagger自体については、SO質問 difference-between-dagger-and-butterknife-Android があり、これらが互いに補完する方法を明確にします。
最終的に3つのうちの1つを使用すると、Androidのデータバインディングに移行するのが難しくなります。パフォーマンスを考慮する必要がある場合、これが最速です。
(パフォーマンスの点で)ButterKnifeとAndroidAnnotationのほうが良いと思います。 ButterKnifeはコンパイル時の注釈(RetentionPolicy.CLASS)を使用しますが、実行時にコードを挿入するため、時間の労力が大きくなります。代わりに、AndroidAnnotationsはコンパイル時にすべての注釈を処理します。