Dagger 2使用概要(3)-Android拡張サポート

6518 ワード

前の2編:Dagger 2使用総括(一)Dagger 2使用総括(二)主にDagger 2のベースライブラリについて簡単にまとめました.この1編ではDagger 2のAndroidサポートライブラリに重点を置き、Androidコンポーネントをカスタマイズし、コードをより簡潔にします.
単純な使用例
シーン:MainActivityMainPresenterオブジェクトを注入する
  • 関連ライブラリ
  • にインポート
    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をフレームワークにバインドすることを実現しました.次に、オブジェクトをどのように注入するかを見てみましょう.
  • MainActivityMainPresenter
  • を注入する.
    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が抽象クラスの抽象メソッドを修飾するために使用されることです.例を見てみましょう.シーン:MainPresenterMainActivityに注入
  • 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よりも効率的であるという利点もあります.
  • 拡張
  • MainPresenterintパラメータidtypeを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);
        }
    }