Android
Кинжал библиотеки 2: Инъекция зависимостей в приложениях
Поиск…
Вступление
Кинжал 2, как объяснено в GitHub , является методом эволюции во время компиляции для инъекций зависимостей. Принимая подход, начатый в Dagger 1.x до его окончательного вывода, Dagger 2.x устраняет все отражения и улучшает четкость кода, удаляя традиционный ObjectGraph
/ Injector
в пользу пользовательских интерфейсов @Component
.
замечания
- Настройка библиотеки в приложении (для проектов maven, gradle, java)
- Преимущества использования Dragger
- Важные ссылки (для документации и демонстраций)
- Как интегрировать и использовать компоненты 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 для вызова каждого модуля внутри.