Android
ライブラリダガー2:アプリケーションの依存性注入
サーチ…
前書き
Dagger 2は、 GitHubで説明したように 、依存性注入に対するコンパイル時の進化のアプローチです。 Dagger 1.xのアプローチを究極の結論に導くDagger 2.xは、すべての反射を排除し、従来のObjectGraph
/ Injector
をユーザー指定の@Component
インターフェイスに@Component
コードの明瞭さを向上さ@Component
ます。
備考
- アプリケーションのライブラリ設定(Maven、gradle、Javaプロジェクト用)
- Draggerの利点
- 重要なリンク(ドキュメントとデモ用)
- Draggerコンポーネントを統合して使用する方法
Dagger 2 API:
Dagger 2はいくつかの特別なアノテーションを公開しています。
メソッドが依存関係を提供するクラスの@Module
@Moduleクラス内のメソッドの@Provides
@Injectで依存関係を要求する(コンストラクタ、フィールド、またはメソッド)
@Componentはモジュールと注入の間のブリッジインターフェースです
重要なリンク:
GitHub: https : //github.com/google/dagger
UserGuide(Google): https : //google.github.io/dagger/users-guide.html
動画: https : //google.github.io/dagger/resources.html
Vogellaチュートリアル: http ://www.vogella.com/tutorials/Dagger/article.html
Codepathチュートリアル: https : //github.com/codepath/android_guides/wiki/Dependency-Injection-with-Dagger-2
オブジェクトの@Moduleクラスと@Singletonアノテーションを作成する
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
@Module
public class VehicleModule {
@Provides @Singleton
Motor provideMotor(){
return new Motor();
}
@Provides @Singleton
Vehicle provideVehicle(){
return new Vehicle(new Motor());
}
}
すべてのプロバイダ(またはメソッド)には@Provides
アノテーションが必要で、クラスには@Module
アノテーションが必要です。 @Singleton
アノテーションは、オブジェクトのインスタンスが1つだけ存在することを示します。
依存オブジェクトの依存関係を要求する
さまざまなモデルのプロバイダがあるので、それらをリクエストする必要があります。 Vehicle
がMotor
必要とするのと同じように、 Vehicle
コンストラクタで@Inject
アノテーションを次のように追加する必要があります。
@Inject
public Vehicle(Motor motor){
this.motor = motor;
}
@Inject
アノテーションを使用すると、コンストラクタ、フィールド、またはメソッドの依存関係をリクエストできます。この例では、コンストラクタに注入を保持しています。
@Modulesと@Injectの接続
依存関係のプロバイダとの間の接続@Module
を介してそれらを要求し、そしてクラス@Inject
用いて行われる@Component
インターフェースであります:
import javax.inject.Singleton;
import dagger.Component;
@Singleton
@Component(modules = {VehicleModule.class})
public interface VehicleComponent {
Vehicle provideVehicle();
}
@Component
アノテーションでは、どのモジュールを使用するかを指定する必要があります。この例では、この例で定義されているVehicleModule
が使用されています 。より多くのモジュールを使用する必要がある場合は、カンマを区切り記号として使用してモジュールを追加します。
@Componentインターフェイスを使用したオブジェクトの取得
すべての接続が準備できたら、このインターフェースのインスタンスを取得し、必要なオブジェクトを取得するメソッドを呼び出さなければなりません。
VehicleComponent component = Dagger_VehicleComponent.builder().vehicleModule(new VehicleModule()).build();
vehicle = component.provideVehicle();
Toast.makeText(this, String.valueOf(vehicle.getSpeed()), Toast.LENGTH_SHORT).show();
@Component
アノテーションを持つインターフェイスの新しいオブジェクトを作成しようとすると、接頭辞Dagger_<NameOfTheComponentInterface>
(この場合はDagger_VehicleComponent
)を使用してインターフェイスを作成し、ビルダーメソッドを使用してその中のすべてのモジュールを呼び出す必要があります。