Dagger 2使用概要(3)-Android拡張サポート
6518 ワード
前の2編:Dagger 2使用総括(一)Dagger 2使用総括(二)主にDagger 2のベースライブラリについて簡単にまとめました.この1編ではDagger 2のAndroidサポートライブラリに重点を置き、Androidコンポーネントをカスタマイズし、コードをより簡潔にします.
単純な使用例
シーン:関連ライブラリ にインポート コアコード
DaggerApplicationはサポートライブラリに由来し、2つ:
プロジェクトで2つのタイプのコンポーネントをサポートする必要がある場合、
ここでは
以上のコードはこの例の実現の重点であり、まず急いで理解しないでください.それはテンプレート化されたコードのように、預言者はそうで、それからゆっくりとその理由を知っています. を注入する.小結 このように理解されるように、我々はまず、アプリケーションの
@Binds を統一的に管理します.は、 に自動的に注入する.小結 上記の
に代わる拡張
単純な使用例
シーン:
MainActivity
にMainPresenter
オブジェクトを注入するimplementation "com.google.dagger:dagger:2.11"
implementation "com.google.dagger:dagger-android:2.11"
implementation "com.google.dagger:dagger-android-support:2.11"
annotationProcessor "com.google.dagger:dagger-compiler:2.11"
annotationProcessor "com.google.dagger:dagger-android-processor:2.11"
MainPresenter
類public class MainPresenter {
@Inject //
public MainPresenter() {
}
public void print() {
Log.d(TAG, "This is a MainPresenter");
}
}
public class AppApplication extends DaggerApplication implements HasSupportFragmentInjector {
@Inject
DispatchingAndroidInjector fragmentSupportInjector;
@Override
protected AndroidInjector extends DaggerApplication> applicationInjector() {
return DaggerAppComponent.create();
}
@Override
public AndroidInjector supportFragmentInjector() {
return fragmentSupportInjector;
}
}
DaggerApplicationはサポートライブラリに由来し、2つ:
dagger.android.DaggerApplication
:通常コンポーネントをサポート、拡張(v 4,v 7)コンポーネントをサポートしないdagger.android.supportDaggerApplication
:拡張コンポーネントをサポート、通常コンポーネントをサポートしないプロジェクトで2つのタイプのコンポーネントをサポートする必要がある場合、
dagger.android.DaggerApplication
を継承し、HasSupportFragmentInjector
インタフェースを実装するという上記のコードの形式を採用することができる.@Component (modules = {
ActivityModule.class, // Activity
AndroidSupportInjectionModule.class, // , v4
AndroidInjectionModule.class}) //
public interface AppComponent extends AndroidInjector{
}
//
@Module
public abstract class ActivityModule {
@ContributesAndroidInjector
abstract MainActivity mainActivity(); // MainActivity
}
ここでは
ActivityModule
クラスを書くのは論理がはっきりしているためだけで、その内部実装をAppComponent
に直接書くこともできます.以上のコードはこの例の実現の重点であり、まず急いで理解しないでください.それはテンプレート化されたコードのように、預言者はそうで、それからゆっくりとその理由を知っています.
MainActivity
をフレームワークにバインドすることを実現しました.次に、オブジェクトをどのように注入するかを見てみましょう.MainActivity
にMainPresenter
public class MainActivity extends DaggerAppCompatActivity { // Dagger
@Inject //
MainPresenter mainPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainPresenter.print();
}
}
AppApplication
およびAppComponent
クラスを用いて、注入に依存するフレームワークを構築し、注入オブジェクトのコンポーネントを必要とし、宣言および継承によってフレームワークにバインドすることによって、オブジェクトを注入することができる.通常のDagger 2の使用に比べて、以下の手順を省略します.@Component
interface MainActivityComponent {
void inject(MainActivity activity);
}
...
DaggerMainActivity_MainActivityComponent.builder().build().inject(this);
@Binds
@Provides
と同様に、インタフェース宣言を使用する場合に使用されます.違いは、@Binds
が抽象クラスの抽象メソッドを修飾するために使用されることです.例を見てみましょう.シーン:MainPresenter
をMainActivity
に注入Presenter
インターフェースおよびMainPresenter
public interface Presenter {
void print();
}
public class MainPresenter implements Presenter {
@Inject //
public MainPresenter() {
}
@Override
public void print() {
Log.d(TAG, "This is MainPresenter");
}
}
MainModule
クラスを追加して、//
@Module
public abstract class MainMoudle {
// , Presenter, MainPresenter
// , @Provides
// MainPresenter
@Binds
abstract Presenter mainPresenter(MainPresenter mainPresenter);
}
@Component (modules = {
ActivityModule.class, // AppComponent ActivityModule
AndroidSupportInjectionModule.class,
AndroidInjectionModule.class})
public interface AppComponent extends AndroidInjector{
}
MainActivity
においてオブジェクトpublic class MainActivity extends DaggerAppCompatActivity {
@Inject // ,
Presenter mainPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainPresenter.print();
}
}
@Binds
abstract Presenter mainPresenter(MainPresenter mainPresenter);
に代わる
@Provides
static Presenter mainPresenter(MainPresenter mainPresenter) {
return new mainPresenter();
}
@Binds
を使用すると@Provides
よりも効率的であるという利点もあります.MainPresenter
にint
パラメータid
type
を2つ追加するには、次の手順に従います.// MainMoudle, @Provides ,@Qualifier
public abstract class MainMoudle {
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface MainPresenterId{}
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface MainPresenterType{}
@Provides
@MainPresenterId
static int getMainPresenterId() { //
return 100; // int
}
@Provides
@MainPresenterType
static int getMainPresenterType() {
return 200;
}
@Binds
abstract Presenter mainPresenter(MainPresenter mainPresenter);
}
public class MainPresenter implements Presenter {
private int id;
private int type;
// @Qualifier
@Inject
public MainPresenter(@MainMoudle.MainPresenterId int id, @MainMoudle.MainPresenterType int type) {
this.id = id;
this.type = type;
}
@Override
public void print() {
Log.d(TAG, "This is MainPresenter id = " + id
+ " type = " + type);
}
}