Dagger2ソースおよび分析の使用(A)

Dagger2の使用および分析ソース

1.Dagger2プロフィール

2.Dagger2プロジェクトの依存関係

使用に3.Dagger2の基礎

4.Dagger2が拡大するために使用します

5.Dagger2ベースソースコード解析



1.Dagger2プロフィール:

ダガーは、静的なJavaとAndroidのの種類、依存性注入(依存性注入)フレームワークのコンパイル時です。主に持ち込ま反射反射の広範な使用のために開発し、パフォーマンスの問題の多くを解決するために使用されます。すべてのすべてで、ダガーは、依存性注入フレームワークの依存性注入の友人は、自分自身の学習を理解しないでくださいです。
:これは、記事の偉大な神ことをお勧めします簡単に、依存関係反転(DIP)、制御の反転(IOC)と依存性注入(DI)で

2.Dagger2プロジェクトの依存関係

  //dagger2相关
    implementation 'com.google.dagger:dagger:2.4'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.4'



3.Dagger2使用するための基礎

今、私たちはこのような3つのカテゴリーがあることを前提としています。1.りんご、2本のバナナ、3ナイフ
ナイフは小平郭、またバナナをカットすることができが、私たちはリンゴやバナナを持っているナイフの必要性を使用するとき、私たちはそれをカットできるように、私たちは、バナナとリンゴのオブジェクトに依存する必要があります。
このように我々のコードのルックスの一般的な未使用ダガーの場合:

public class Knife
{
    private static final String TAG = "aaa";
    private Apple apple;
    private Bnana bnana;
    
    public void cut()
    {
        apple = new Apple();
        bnana = new Bnana();
        Log.d(TAG, "cut: 我要切苹果");
        apple.introSelf();
        Log.d(TAG, "cut: 我要切香蕉");
        apple.introSelf();
    }
}

そして、前記クラスのアップルBnanaクラスのコードは次のよう:

public class Apple
{
    private static final String TAG = "aaa";

    public void introSelf()
    {
        Log.d(TAG, "555,我是苹果");
    }
}
public class Bnana
{
    private static final String TAG = "aaa";

    public void introSelf()
    {
        Log.d(TAG, "我是香蕉");
    }
}

私たちは、依存性注入(未使用ダガー)を使用すると、ナイフは、そのようなクラスコードになります

public class Knife
{
    private static final String TAG = "CUT";
    
    public void cut(Apple apple, Bnana bnana)
    {
        Log.d(TAG, "cut: 我要切苹果");
        apple.introSelf();
        Log.d(TAG, "cut: 我要切香蕉");
        apple.introSelf();
    }
}

オブジェクトのためのナイフは、作業が簡単になる、ではないですが、また、これらの三つのクラス間の結合を低減します。私たちは、コーダのためにしかし、我々はまだ、作業負荷が大幅に軽減されていない、新しいAppleのオブジェクトとBnanaオブジェクトとパスカット()メソッドが必要になります。
しかし、我々は次のように変更と短剣、ナイフのクラスコードを使用する場合:

public class Knife
{
    private static final String TAG = "CUT";

    @Inject
    Apple apple;
    
    @Inject
    Bnana bnana;
    
  	@Inject
    public Knife() {
    }
 
    public void cut()
    {
        Log.d(TAG, "cut: 我要切苹果");
        apple.introSelf();
        Log.d(TAG, "cut: 我要切香蕉");
        apple.introSelf();
    }
}

私たちはこれで新しい、限り、我々はオブジェクトが可能マークされたアノテーションを使って注入する必要があるように、これらの2つのオブジェクトに関するケアへの不要になりました。
私たちはいくつかの一般的なDagger2ノートを見てみましょう:

@Injectコメント

あなたのコードの上に私たちが使用@Injectノートを、それが自動的に私たちのためにAppleとBnanaターゲットオブジェクトへの依存に注入することができます。しかし、この前提は、私たちのクラスまたはApple Bnanaクラスのコンストラクタが使用必要がある@Inject注釈マークを。
今、アップルのクラスコードは次のよう:

public class Apple
{
    private static final String TAG = "aaa";

    @Inject
    public Apple() {
    }

    public void introSelf()
    {
        Log.d(TAG, "555,我是苹果");
    }
}

ナイフアップルので、私たちのクラスのオブジェクトは、私たちのために自動的にDagger2によって注入され、私たちは、新しいオブジェクトにアップルのコードでイニシアチブを取ることはなかったです。すべてが自動的にDagger2フレームを言及しました。




もう一つのシーン:
今、私たちが食べるためにバナナをカットしたい、しかし、バナナが栽培され、バナナは自分の足が私たちの手を走っない私たちは熱帯のバナナを持っていません。我々は唯一の仲介者を通じてすることができます。この時点で-バナナフルーツショップを取得します。この時点で、果物屋モジュールとなり

@Moduleコメント

私たちは、サードパーティのドキュメントを使用し、そのクラスでファイルを変更することが許可されていない場合は、その後、私たちは私たちが第三者のオブジェクトを得るために中産階級を必要とする、(私たちはそのコンストラクタに@Injectコメントを追加してみましょう)。単に、次のとおりです。

@Module
public class DaggerModule {

    @Provides
    public Bnana getBnana()
    {
    //简单写法,一般会视情况传入一个接口或者父类
        return new Bnana();
    }
}

@Providesコメント

@Module注釈が使用され、この方法は、この例にオブジェクトを取得します

@成分

今、私たちの主なコードはほぼ同じでしたが、我々は、唯一の@Inject注釈は依存別々マークするされている私たちのクラスのすべてを見つけることができ、その後、我々は橋を------れる必要@Componentの注釈インタフェースは対応する二つのタイプに@Injectの注釈、リンク、および使用するかどうかを決定@Injectマークコンストラクタ依存性注入、または使用に注釈として@Module注釈と@Provides注入依存関係に注釈。

実際には、それが発生し、それがクラスのインスタンスを保持している場合、ルールある@Inject注釈(例えば、上記の例でMainActivityナイフオブジェクト@Injectを注釈付き登場)、優先スキャン@Module注釈と@Provides注入依存関係に注釈をそのオブジェクトのコンストラクタは、それはまた、使用するかどうかを確認するためにスキャンされ@Injectコメントを。

私たちのManiActivityでは、我々は、ナイフのオブジェクトを必要とするので、我々はオブジェクト書かれたのManiActivityインスタンス@Component注釈インターフェースなので、私たちに必要な射出短剣MainActivity依存います。前記複数のモジュールは、モジュール{Module1.class、Module2.class} =形で書き込まれた値であってもよいです。我々はMainActivity Bnanaは(モジュールとプロバイダを使用して)オブジェクトを使用していませんでしたが、私たちはナイフオブジェクトを使用しますがここでは、ナイフは(ここでは、ネストされた依存がある)Bnanaオブジェクトに依存する必要性をオブジェクト。DaggerModuleこのクラスのコードは次のよう:

//modules = 自己定义的可以提供目标对象的module类
@Component(modules = {DaggerModule.class})
public interface MainActivityComponent
{
    //为传入的MainActivity对象注入所需的依赖knife,并且为knife注入所需要的的依赖
    void inject(MainActivity mainActivity);
}

私たちのMainActivityコードは次のようである:
2つの注入方法の比較のために、我々は別に書くリンゴとバナナのカットをカットします。

public class MainActivity extends AppCompatActivity {
    Button apple;
    Button bnana;

    @Inject
    Knife knife;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initOnclike();

//核心代码
        MainActivityComponent component = DaggerMainActivityComponent.builder().build();
        component.inject(this);

    }

    private void initOnclike() {
        apple.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                knife.cutApple();

            }
        });
        bnana.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                knife.cutBnana();
            }
        });

    }

    private void initView() {
        apple = findViewById(R.id.eatApple);
        bnana = findViewById(R.id.eatBnana);

    }
}

ここでは、使用のデモにダガーシンプルで、どのようなものであるかの並べ替え依存性注入の二つの基本的な手段の:

クラスの1.は依存してい@Injectのオブジェクトノートクラスのニーズが注入され、その後、クラスで使用する@Inject引数なしで、アノテーションクラスのコンストラクタを。
2.モジュールが使用中で提供@Providerターゲットオブジェクトを返すことができ、この場合2つの場合に分け、一つのオブジェクトがパラメータで(ケース1)に渡されており、他方は新規であり、注釈付きメソッド返されるオブジェクト(ケース2)。@injectzアノテーションは、最初ではなく、その逆を使用して、第一又は第二の缶を使用することができるときときに、2つの方法の違いは、クラスのコンストラクタです。

情况1:
	 @Provides
     public Bnana getBnana(Bnana bnana)
    {
        return  bnana;
    }
情况2:

	@Provides
     public Bnana getBnana()
    {
        return  new GuaZi();
    }

用紙の長さを避けるためには長すぎる、残りは次回の記事でカバーします。Dagger2ソースおよび分析の使用(B)

公開された47元の記事 ウォン称賛15 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_41525021/article/details/103457063