dagger-2 Изучите Dagger2 с простым примером


пример

Я читал и смотрел множество разных уроков Dagger2, но большинство из них слишком долго или трудно понять, поэтому я решил написать новый простой и короткий учебник для Dagger2, надеюсь, вам понравится.

Зачем нам это нужно?

  • Упрощает доступ к общим экземплярам. Он предоставляет простой способ получить ссылки на общие экземпляры, например, как только мы объявим в кинжале наши экземпляры singleton, такие как SharedPrefrences тогда мы можем объявить поля с простой аннотацией @Inject .
  • Простота тестирования модулей и интеграции: мы можем легко поменять модули, которые делают сетевые ответы и издеваются над этим поведением.

Начнем с простого примера.

Полный исходный пример доступен в моей учетной записи GitHub.

Добавить зависимости Dagger2

Прежде всего нам нужно добавить зависимости Dagger2, Поместить ниже код в файл build.gradle на уровне модуля.

compile "com.google.dagger:dagger:$dagger_version"
compile "com.google.dagger:dagger-android:$dagger_version"
compile "com.google.dagger:dagger-android-support:$dagger_version"
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"

Если вы получаете ошибку, такую ​​как Ошибка: Конфликт с зависимостью 'com.google.code.findbugs: jsr305' в проекте ': app', вы должны добавить следующее в свой основной файл app / build.gradle.

configurations.all {
   resolutionStrategy.force 'com.google.code.findbugs:jsr305:3.0.1'
}

Два простых класса

У нас есть два класса (Автомобиль и Двигатель), Требования к классу автомобиля. Класс двигателя для запуска, а MainActivity - класс автомобиля. Мы будем использовать Dagger2 для предоставления этих экземпляров.

class Vehicle {
   private Motor motor;

  @Inject
  Vehicle(Motor motor) {
     this.motor = motor;
  }

  void increaseSpeed(int value) {
     motor.accelerate(value);
  }

  void decreaseSpeed(int value) {
     motor.decelerate(value);
  }

  void stop() {
     motor.brake();
  }

  int getSpeed() {
     return motor.getRpm();
  }
}

Класс двигателя:

class Motor {
  private int rpm;

  Motor() {
    this.rpm = 0;
  }

  int getRpm() {
    return rpm;
  }

  void accelerate(int value) {
    rpm += value;
  }

  void decelerate(int value) {
    rpm -= value;
  }

  void brake() {
    rpm = 0;
  }
}

Класс модуля

Класс модуля отвечает за предоставление объектов, которые могут быть введены. В этом примере мы хотим ввести класс Motor в класс Vehicle и ввести класс Vehicle в MainActivity, чтобы мы создали MyModule для предоставления этих экземпляров.

@Module
class MyModule {

  @Provides
  @Singleton
  Motor provideMotor() {
    return new Motor();
  }

  @Provides
  @Singleton
  Vehicle provideVehicle() {
    return new Vehicle(new Motor());
  }
}

@Provide аннотация: возвращенный объект из этого метода доступен для инъекции зависимостей.

Интерфейс @Component

Dagger2 нуждается в компонентном интерфейсе, чтобы знать, как он должен создавать экземпляры из наших классов.

@Singleton
@Component(modules = {MyModule.class})
interface MyComponent {
  Vehicle provideVehicle();

  void inject(MainActivity main);
}

Интерфейс @Component: соединение между поставщиком объекта и объектами, выражающими зависимость.

Инъекционная зависимость в конструкторе

Добавляя @Inject аннотацию, dagger2 может автоматически создать экземпляр из этого объекта, например, нашего объекта Motor в классе Vehicle.

Инъекционная зависимость в MainClass

Dagger2 может автоматически встраивать зависимости в конструкторы, но компоненты Android (действия, фрагменты и т. Д.) Создаются с помощью фреймворка Android, что затрудняет использование им инъекций зависимостей, поэтому мы должны вводить их вручную, как показано ниже:

public class MainActivity extends AppCompatActivity {
  @Inject
  Vehicle vehicle;

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

    MyComponent component = DaggerMyComponent.builder().build();
    component.inject(this);
  }
}

Вот и все, надеюсь, вам понравится.