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 для вызова каждого модуля внутри.