Поиск…


Вступление

Кинжал 2, как объяснено в GitHub , является методом эволюции во время компиляции для инъекций зависимостей. Принимая подход, начатый в Dagger 1.x до его окончательного вывода, Dagger 2.x устраняет все отражения и улучшает четкость кода, удаляя традиционный ObjectGraph / Injector в пользу пользовательских интерфейсов @Component .

замечания

  1. Настройка библиотеки в приложении (для проектов maven, gradle, java)
  2. Преимущества использования Dragger
  3. Важные ссылки (для документации и демонстраций)
  4. Как интегрировать и использовать компоненты Dragger

Dagger 2 API:

Кинжал 2 предоставляет ряд специальных аннотаций:

@Module для классов, методы которых обеспечивают зависимости

@Provides для методов в классах @Module

@Inject для запроса зависимости (конструктор, поле или метод)

@Component - это интерфейс моста между модулями и инъекцией

Важные ссылки:

GitHub: https://github.com/google/dagger

UserGuide (Google): https://google.github.io/dagger/users-guide.html

Видео: https://google.github.io/dagger/resources.html

Vogella Tutorial: http://www.vogella.com/tutorials/Dagger/article.html

Codepath Tutorial: https://github.com/codepath/android_guides/wiki/Dependency-Injection-with-Dagger-2

Создайте аннотацию @Module и @Singleton для объекта

import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;

@Module
public class VehicleModule {
 
    @Provides @Singleton
    Motor provideMotor(){
        return new Motor();
    }
 
    @Provides @Singleton
    Vehicle provideVehicle(){
        return new Vehicle(new Motor());
    }
}

Каждый поставщик (или метод) должен иметь аннотацию @Provides а класс должен иметь аннотацию @Module . Аннотация @Singleton указывает, что будет только один экземпляр объекта.

Зависимость запросов от зависимых объектов

Теперь, когда у вас есть поставщики для разных моделей, вам необходимо их запросить. Так же, как Vehicle нуждается в Motor , вы должны добавить аннотацию @Inject в конструктор Vehicle следующим образом:

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

Вы можете использовать аннотацию @Inject для запроса зависимостей в конструкторе, полях или методах. В этом примере я сохраняю инъекцию в конструкторе.

Подключение @Modules с @Inject

Соединение между поставщиком зависимостей, @Module и классами, запрашивающими их через @Inject , выполняется с помощью @Component , который является интерфейсом:

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

@Singleton
@Component(modules = {VehicleModule.class})
public interface VehicleComponent {
    Vehicle provideVehicle();
}

Для аннотации @Component вы должны указать, какие модули будут использоваться. В этом примере используется VehicleModule , который определен в этом примере . Если вам нужно использовать больше модулей, просто добавьте их, используя запятую в качестве разделителя.

Использование интерфейса @Component для получения объектов

Теперь, когда у вас есть все готовые соединения, вы должны получить экземпляр этого интерфейса и вызвать его методы для получения требуемого объекта:

VehicleComponent component = Dagger_VehicleComponent.builder().vehicleModule(new VehicleModule()).build();
vehicle = component.provideVehicle();
Toast.makeText(this, String.valueOf(vehicle.getSpeed()), Toast.LENGTH_SHORT).show();

Когда вы пытаетесь создать новый объект интерфейса с @Component аннотации @Component , вы должны сделать это, используя префикс Dagger_<NameOfTheComponentInterface> , в данном случае Dagger_VehicleComponent , а затем используйте метод builder для вызова каждого модуля внутри.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow