- PVSM.RU - https://www.pvsm.ru -
Ниже вы увидите вольный перевод статьи Miquel Beltran [1], опубликованной на
Medium [2] 12 февраля 2016 года. Целью статьи является формирование понимания базового механизма работы Dagger 2.
Я обнаружил, что большинство руководств, объясняющих как работает Dagger, слишком сложны. Даже руководство Google/Square [3] слишком тяжелое для понимания, если у вас нет четкого представления о том, как работает внедрение зависимостей [4].
Чтобы понять это, я создал очень простой Java-проект [5] с несколькими классами, который показывает, как работает Dagger.
В этой статье я объясню основные составляющие Dagger. Статья нацелена на тех, кто не пользуется данной библиотекой, но планирует.
apply plugin: 'java'
repositories {
jcenter()
}
dependencies {
testCompile 'junit:junit:4.12'
compile 'com.google.dagger:dagger:2.0'
compile 'com.google.dagger:dagger-compiler:2.0'
}
Это код файла build.gradle. Будет использоваться стандартный java плагин и JUnit для создания модульных тестов. Не забудьте добавить в зависимости библиотеку dagger-compiler (это была моя первая ошибка).
В этом примере будет два класса:
Без внедрения зависимостей получилось бы что-то вроде следующего: класс GameData создается внутри GameSession. Некоторые разработчики согласятся с тем, что это плохая практика. Например, если требуется другой экземпляр GameData для тестирования, то создать его будет невозможно.
public class GameData {
public final String hello = "Hello Dagger";
}
public class GameSession {
public GameData data = new GameData();
}
Dagger позаботится за нас о внедрении экземпляра класса GameData в переменную класса GameSession. Необходимо лишь указать это с помощью аннотации @Inject
.
public class GameData {
public final String hello = "Hello Dagger";
}
import javax.inject.Inject;
public class GameSession {
@Inject
public GameData data;
}
Теперь нужно создать классы, которые определят, как будет реализовано внедрение зависимостей, это Component и Module.
import dagger.Component;
@Component(modules = GameModule.class)
public interface GameComponent {
void inject(GameSession obj);
}
import dagger.Module;
import dagger.Provides;
@Module
public class GameModule {
@Provides
GameData providesGameData() {
return new GameData();
}
}
@Provides
, которая говорит Dagger, что это одна из тех функций, которая возвращает экземпляр GameData.@Module
.В этом моменте заключена вся магия. Dagger поймет, что классу GameSession требуется класс GameData, что класс GameModule определяет, как будет получен экземпляр GameData; что необходимо воспользоваться интерфейсом GameComponent для начала инъекции, вызываемой из класса GameSession.
Следующий модульный тест показывает, как внедрить класс GameData в созданный экземпляр класса GameSession, используя сгенерированный класс типа Component.
import org.junit.Test;
import static org.junit.Assert.*;
public class GameSessionTest {
@Test
public void testGameSession() {
GameSession session = new GameSession();
DaggerGameComponent.create().inject(session);
assertEquals("Hello Dagger", session.data.hello);
}
}
Этот пример прост, в нём пропущено множество функциональных возможностей Dagger. Как я уже сказал, этот пример помог мне понять основы, и я надеюсь, что он поможет и вам.
Теперь, когда у вас есть общее представление о том, как работает Dagger 2, я рекомендую вернуться к исходной документации и попробовать разобрать пример с CoffeeMaker [3].
Автор: tehreh1uneh
Источник [6]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/269137
Ссылки в тексте:
[1] Miquel Beltran: https://medium.com/@Miqubel
[2] Medium: https://medium.com/@Miqubel/understanding-dagger-2-367ff1bd184f
[3] руководство Google/Square: http://google.github.io/dagger/users-guide.html
[4] внедрение зависимостей: https://en.wikipedia.org/wiki/Dependency_injection
[5] очень простой Java-проект: https://github.com/miquelbeltran/java-dagger-example
[6] Источник: https://habrahabr.ru/post/343212/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox
Нажмите здесь для печати.