[JAVA] Dolch2 - Android-Abhängigkeitsinjektion

Was ist DI?

Dipendency Injection (DI), "Injektion von Objekten".

Kurz gesagt, das freie Ersetzen der Abhängigkeiten erleichtert das Ausführen von Tests (Mock einfügen) und das individuelle Verwalten jedes Objekts.

Die Notwendigkeit für DI auf Android

Wenn Sie beispielsweise Daten in SharedPreferences speichern möchten, werden durch Ausführen ohne DI die Daten von SharedPreferences instanziiert, gespeichert und abgerufen, die alle aktivitätsähnlich beschrieben werden müssen. スクリーンショット 2020-06-24 15.34.25.png

Wenn die App auf diese Weise wächst, kann sie im schlimmsten Fall irreparabel sein.

Anstatt SharedPreferences in der Aktivität jedes Mal zu instanziieren, injizieren Sie sie aus einer anderen Klasse.

スクリーンショット 2020-06-24 15.37.29.png

Was ist Dolch2?

Eine Bibliothek, die 2012 von Square-Entwicklern entwickelt wurde.

Dagger1 wurde verwendet, um eine Instanz der Klasse zu erstellen und Abhängigkeiten über Reflection einzufügen. Später wurde Dagger 2 in Zusammenarbeit mit dem Google-Entwicklungsteam mit einer viel schnelleren Version eingeführt, die keine Reflexionen verwendet.

Dagger2 ist ein Android-abhängiges Injection-Framework zur Kompilierungszeit, das Java Specification Request (JSR) 330 verwendet und einen Anmerkungsprozessor verwendet.

Die in Dagger2 verwendeten grundlegenden Anmerkungen lauten wie folgt.

@Module: Eine Klasse, die Objekte erstellt, die schließlich als Abhängigkeiten bereitgestellt werden @Provides: Wird in Methoden in der Module-Klasse verwendet, die Objekte zurückgeben @Inject: Gibt an, dass eine Abhängigkeit angefordert wurde (wird in Konstruktor / Feld / Methode verwendet). @Component: Bridge-Klasse zum Übergeben von Abhängigkeiten an Klassen, die Module anfordern @Singleton: Gibt an, dass eine einzelne Instanz in einer Abhängigkeit erstellt werden soll

Sample

main_activity.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.journaldev.dagger2.MainActivity">

    <EditText
        android:id="@+id/inUsername"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:hint="Username" />

    <EditText
        android:id="@+id/inNumber"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/inUsername"
        android:layout_margin="8dp"
        android:inputType="number"
        android:hint="Number" />

    <Button
        android:id="@+id/btnSave"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="SAVE"
        android:layout_below="@+id/inNumber"
        android:layout_toLeftOf="@+id/btnGet"
        android:layout_toStartOf="@+id/btnGet"
        android:layout_marginRight="8dp"
        android:layout_marginEnd="8dp" />

    <Button
        android:id="@+id/btnGet"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="GET"
        android:layout_below="@+id/inNumber"
        android:layout_alignRight="@+id/inNumber"
        android:layout_alignEnd="@+id/inNumber" />

</RelativeLayout>

Definieren Sie Abhängigkeiten mit Module

SharedPrefModule.java


package com.journaldev.dagger2;

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;

@Module
public class SharedPrefModule {
    private Context context;

    public SharedPrefModule(Context context) {
        this.context = context;
    }

    @Singleton
    @Provides
    public Context provideContext() {
        return context;
    }

    @Singleton
    @Provides
    public SharedPreferences provideSharedPreferences(Context context) {
        return PreferenceManager.getDefaultSharedPreferences(context);
    }
}

Definition von Objekten, die an abhängige Klassen in Component übergeben werden

MyComponent.java


package com.journaldev.dagger2;

import javax.inject.Singleton;
import dagger.Component;

@Singleton
@Component(modules = {SharedPrefModule.class})
public interface MyComponent {
    void inject(MainActivity activity);
}

Schreiben Sie @inject, wo es in der Abhängigkeit benötigt wird (dort injiziert)

MainActivity.java


package com.journaldev.dagger2;

import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import javax.inject.Inject;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {


    EditText inUsername, inNumber;
    Button btnSave, btnGet;
    private MyComponent myComponent;
    @Inject
    SharedPreferences sharedPreferences;

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

        initViews();
        myComponent = DaggerMyComponent.builder().sharedPrefModule(new SharedPrefModule(this)).build();
        myComponent.inject(this);


    }

    private void initViews() {
        btnGet = findViewById(R.id.btnGet);
        btnSave = findViewById(R.id.btnSave);
        inUsername = findViewById(R.id.inUsername);
        inNumber = findViewById(R.id.inNumber);
        btnSave.setOnClickListener(this);
        btnGet.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {

            case R.id.btnGet:
                inUsername.setText(sharedPreferences.getString("username", "default"));
                inNumber.setText(sharedPreferences.getString("number", "12345"));
                break;
            case R.id.btnSave:
                SharedPreferences.Editor editor = sharedPreferences.edit();
                editor.putString("username", inUsername.getText().toString().trim());
                editor.putString("number", inNumber.getText().toString().trim());
                editor.apply();
                break;

        }
    }
}

schließlich

Es ist rau, aber das Obige ist die Erklärung von Dagger2. Ich werde es in Zukunft aktualisieren.

Recommended Posts

Dolch2 - Android-Abhängigkeitsinjektion
DI: Was ist Abhängigkeitsinjektion?
Fassen Sie Ruby und Dependency Injection zusammen
Warum Dependency Injection nicht so schlecht ist
[Java] [Spring] Spring Boot Das mysteriöse Hamarineta der Abhängigkeitsinjektion
Spring Dependency Injection mit Java, Kotlin