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以上で構成できます
    dependencies {
      compile 'com.google.dagger:dagger:2.x'
      annotationProcessor 'com.google.dagger:dagger-compiler:2.x'
    }
    

    Gradleプラグインが2.3以下の場合、aptプラグインを借りなければなりません.
  • ルートgradleで
    dependencies {
         ... //   classpath
         classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //  apt  
     }
    
  • はApp.gradle中
    dependencies {
      compile 'com.google.dagger:dagger:2.x'
      apt 'com.google.dagger:dagger-compiler:2.x'
    }
    
  • @Inject
    Dagger 2ではjavaxを用いる.inject.Inject注記は、Dagger構築アプリケーションクラスのインスタンスを満たし、その依存性を満たすために、注入に依存するコンストラクション関数およびフィールドを識別します.
    @Injectには2つの役割があります.
  • 注記コンストラクション関数:タグコンストラクション関数によって、Dagger 2がクラスのインスタンスを作成できることを伝え(Dagger 2はInjectタグによってこのクラスインスタンスが必要なときにこのコンストラクション関数を見つけて関連インスタンスnewを出すことができる)、依存関係を提供する.
  • 注記依存変数:タグ依存変数により、Dagger 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インスタンスを簡単に注入します.
    注記フィールド
    この場合、すべてのメンバー変数が基本データ型ではなく、あるメンバー変数自体がクラスのインスタンスであるという疑問があります.これで、依存注入を使用することができますか?このような疑問がある以上、試してみてはいかがでしょうか.
  • AreaBeanとScoreBeanを作成し、その構築関数は
    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;
        }
    
        ***
    }
    
  • である.
  • Studioインスタンスを変更し、AreaBean、ScoreBean
    public class StudentBean {
        private int no;
        private String name;
    
        @Inject
        AreaBean areaBean;
        @Inject
        ScoreBean scoreBean;
    
        @Inject
        public StudentBean() {
            this.no = 1;
            this.name = "  ";
        }
    
        ***
    }
    
  • の分散を持つ2つのメンバー変数を追加します.
  • 試験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='  ', areaBean=AreaBean{provice='  ', city='  '},scoreBean=ScoreBean{chinese=90.5, math=78.0}}
            Log.d("test", "student:" + studentBean.toString());
            tvStu.setText(studentBean.toString());
        }
    
    ***
    
    }
  • テスト結果から,@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チュートリアルがあるのか、私はこの文章を書いた.