Dagger 2浅いから深い(一)
5157 ワード
Daggerシリーズ: Dagger 2浅いから深い(一) Dagger 2浅いから深い(二) Dagger 2浅いから深い(3) Dagger 2浅いから深い(4) Dagger 2浅いから深い(5) Dagger 2浅いから深い(6) Dagger 2浅いから深い(7) Dagger 2はAndroidの完璧な拡張ライブラリ-daggerに応用されている.android
Demoアドレス: DaggerLearn Kotlin-Dagger-2-Retrofit-Android-Architecture-Components
概要
Dagger 2の公式文書には、「A fast dependency injector for Android and Java.」という言葉があります.AndroidやJavaの急速な依存注入に適しています.
ここでは主にDagger 2を理解し,依存注入についてはあまり述べない.依存注入を理解していない場合は、次のブログを参照してください.制御反転(IoC)と依存注入(DI) 浅談依存注入 理解依存注入(IOC)と学習Unity Gradle構成
Gradleプラグインは2.3以上で構成できます
Gradleプラグインが2.3以下の場合、aptプラグインを借りなければなりません.ルートgradleで はApp.gradle中 @Inject
Dagger 2ではjavaxを用いる.inject.Inject注記は、Dagger構築アプリケーションクラスのインスタンスを満たし、その依存性を満たすために、注入に依存するコンストラクション関数およびフィールドを識別します.
@Injectには2つの役割があります.注記コンストラクション関数:タグコンストラクション関数によって、Dagger 2がクラスのインスタンスを作成できることを伝え(Dagger 2はInjectタグによってこのクラスインスタンスが必要なときにこのコンストラクション関数を見つけて関連インスタンスnewを出すことができる)、依存関係を提供する. 注記依存変数:タグ依存変数により、Dagger 2は依存関係を提供し、注入変数 注記コンストラクション関数
ここでは、構造関数を@Injectで注記し、Dagger 2によってインスタンスを作成するStudentBeanオブジェクトについて説明します.
テスト:
ここでは、完了してもStudentBeanインスタンスを簡単に注入します.
注記フィールド
この場合、すべてのメンバー変数が基本データ型ではなく、あるメンバー変数自体がクラスのインスタンスであるという疑問があります.これで、依存注入を使用することができますか?このような疑問がある以上、試してみてはいかがでしょうか. AreaBeanとScoreBeanを作成し、その構築関数は である. Studioインスタンスを変更し、AreaBean、ScoreBean の分散を持つ2つのメンバー変数を追加します.試験public class StudentActivity extends BaseActivity{ テスト結果から,@Inject注記フィールドでも,Daggerは対応するインスタンスを作成して注入できることが明らかになった.
注意:クラスに@Inject注釈のフィールドがある場合、そのフィールドの構築関数は@Inject注釈を使用していません.この場合、Daggerはリクエスト時にこれらのフィールドを注入しますが、新しいインスタンスは作成されません.つまり、空のオブジェクトが取得されることを意味します.@Injectコメントを使用して、Daggerがインスタンスを作成できることを示すパラメータなしコンストラクション関数を追加します.この場合、コンパイルに失敗したり、Providerメソッド(後述)の追加を求めたりして、必要なインスタンスを提供します. Daggerはメソッド注入をサポートするが、通常はコンストラクタまたはフィールドの依存注入に使用される.
@Injectは万能ではありません
@Injectは万能ではなく、未知のものに対しては、どうしようもない.たとえば、よく知られているインタフェースでは、インタフェースがインスタンスを作成できません.この場合、@Inject注釈は使用できません.インタフェースは を作成できません.サードパーティ製ライブラリのクラスは を作成できません.構成オブジェクトは構成する必要があります!
終わりの言葉
ここまで,Dagger 2入門の簡単な例が実現された.簡単にまとめます.@Inject注記コンストラクション関数は、クラスがDaggerにインスタンス の作成を依頼したことを示す.@Injectは属性変数を宣言し,この依存を注入することを示す.この変数能力がインスタンスオブジェクトである場合、そのコンストラクション関数は@Inject注釈を使用するか、Providerメソッドで提供する必要があります. @Injectは万能ではありません.
リファレンスドキュメント浅析Dagger 2の使用 Android:dagger 2手放せない-ベース依存注入フレームワーク編 Android:dagger 2手放せない-重点概念解説、融合編 Android:dagger 2手放せない-終結編 「サラダ1皿」Dagger 2(一)のHelloWorld へ案内 Dagger 2図文完全教 なぜネット上でこんなに多くのdagger 2チュートリアルがあるのか、私はこの文章を書いた.
Demoアドレス:
概要
Dagger 2の公式文書には、「A fast dependency injector for Android and Java.」という言葉があります.AndroidやJavaの急速な依存注入に適しています.
ここでは主にDagger 2を理解し,依存注入についてはあまり述べない.依存注入を理解していない場合は、次のブログを参照してください.
Gradleプラグインは2.3以上で構成できます
dependencies {
compile 'com.google.dagger:dagger:2.x'
annotationProcessor 'com.google.dagger:dagger-compiler:2.x'
}
Gradleプラグインが2.3以下の場合、aptプラグインを借りなければなりません.
dependencies {
... // classpath
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' // apt
}
dependencies {
compile 'com.google.dagger:dagger:2.x'
apt 'com.google.dagger:dagger-compiler:2.x'
}
Dagger 2ではjavaxを用いる.inject.Inject注記は、Dagger構築アプリケーションクラスのインスタンスを満たし、その依存性を満たすために、注入に依存するコンストラクション関数およびフィールドを識別します.
@Injectには2つの役割があります.
ここでは、構造関数を@Injectで注記し、Dagger 2によってインスタンスを作成するStudentBeanオブジェクトについて説明します.
public class StudentBean {
private int no;
private String name;
@Inject
public StudentBean() {
this.no = 1;
this.name = " ";
}
***
}
テスト:
public class StudentActivity extends BaseActivity {
***
@Inject
StudentBean studentBean;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ButterKnife.bind(this);
// Log("student:StudentBean{no=1, name=' '}")
Log.d("test", "student:" + studentBean.toString());
tvStu.setText(studentBean.toString());
}
***
}
ここでは、完了してもStudentBeanインスタンスを簡単に注入します.
注記フィールド
この場合、すべてのメンバー変数が基本データ型ではなく、あるメンバー変数自体がクラスのインスタンスであるという疑問があります.これで、依存注入を使用することができますか?このような疑問がある以上、試してみてはいかがでしょうか.
public class AreaBean {
private String provice;
private String city;
@Inject
public AreaBean() {
this.provice = " ";
this.city = " ";
}
***
}
public class ScoreBean {
private double chinese;
private double math;
@Inject
public ScoreBean() {
this.chinese = 90.5;
this.math = 78.0;
}
***
}
public class StudentBean {
private int no;
private String name;
@Inject
AreaBean areaBean;
@Inject
ScoreBean scoreBean;
@Inject
public StudentBean() {
this.no = 1;
this.name = " ";
}
***
}
、***
@Inject
StudentBean studentBean;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ButterKnife.bind(this);
// Log:student:StudentBean{no=1, name=' ', areaBean=AreaBean{provice=' ', city=' '},scoreBean=ScoreBean{chinese=90.5, math=78.0}}
Log.d("test", "student:" + studentBean.toString());
tvStu.setText(studentBean.toString());
}
***
}注意:
@Injectは万能ではありません
@Injectは万能ではなく、未知のものに対しては、どうしようもない.たとえば、よく知られているインタフェースでは、インタフェースがインスタンスを作成できません.この場合、@Inject注釈は使用できません.
終わりの言葉
ここまで,Dagger 2入門の簡単な例が実現された.簡単にまとめます.
リファレンスドキュメント