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.
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.
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.
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;
}
}
}
Es ist rau, aber das Obige ist die Erklärung von Dagger2. Ich werde es in Zukunft aktualisieren.
Recommended Posts