サーチ…


前書き

Dagger 2は、 GitHub説明したように 、依存性注入に対するコンパイル時の進化のアプローチです。 Dagger 1.xのアプローチを究極の結論に導くDagger 2.xは、すべての反射を排除し、従来のObjectGraph / Injectorをユーザー指定の@Componentインターフェイスに@Componentコードの明瞭さを向上さ@Componentます。

備考

  1. アプリケーションのライブラリ設定(Maven、gradle、Javaプロジェクト用)
  2. Draggerの利点
  3. 重要なリンク(ドキュメントとデモ用)
  4. 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つだけ存在することを示します。

依存オブジェクトの依存関係を要求する

さまざまなモデルのプロバイダがあるので、それらをリクエストする必要があります。 VehicleMotor必要とするのと同じように、 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 )を使用してインターフェイスを作成し、ビルダーメソッドを使用してその中のすべてのモジュールを呼び出す必要があります。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow