SlideShare a Scribd company logo
1 of 52
Download to read offline
{
Dagger2: dependency
injection in Android
Vladimir Tagakov
Hollywood Principle
 Не звоните нам, мы сами вам перезвоним.
Hollywood Principle
 Это паттерн проектирования, а не
библиотека.
 В каждом проекте используется DI
Dependency Injection
Tweeter
Tiwtter
API
Network
Client
Dependency Injection
public class Tweeter { public void tweet(String tweet) {
TwitterApi api = new TwitterApi();
api.postTweet("JakeWharton", tweet);
}
}
public class TwitterApi {
public void postTweet(String user, String tweet) {
OkHttpClient client = new OkHttpClient();
Request request = //...
client.newCall(request).execute();
} }
public class TwitterApi {
private final OkHttpClient client =
new OkHttpClient();
public void postTweet(String user, String tweet) {
Request request = //...
client.newCall(request).execute();
} }
public class TwitterApi {
private final OkHttpClient client =
new OkHttpClient();
public void postTweet(String user, String tweet) {
Request request = //...
client.newCall(request).execute();
} }
public class TwitterApi {
private final OkHttpClient client;
public TwitterApi(OkHttpClient client) { this.client
= client;
}
public void postTweet(String user, String tweet) {
Request request = //...
client.newCall(request).execute();
} }
public class Tweeter { public void tweet(String tweet) {
TwitterApi api = new TwitterApi();
api.postTweet("JakeWharton", tweet);
}
}
public class Tweeter { public void tweet(String tweet) {
TwitterApi api = new TwitterApi(
new OkHttpClient()
);
api.postTweet("JakeWharton", tweet);
}
}
public class Tweeter { public void tweet(String tweet) {
TwitterApi api = new TwitterApi(
new OkHttpClient()
);
api.postTweet("JakeWharton", tweet);
}
}
public class Tweeter { private final TwitterApi api =
new TwitterApi(new OkHttpClient());
public void tweet(String tweet) {
api.postTweet("JakeWharton", tweet);
}
}
public class Tweeter { private final TwitterApi api =
new TwitterApi(new OkHttpClient());
public void tweet(String tweet) {
api.postTweet("JakeWharton", tweet);
}
}
public class Tweeter { private final TwitterApi api =
new TwitterApi(new OkHttpClient());
public Tweeter(String user) { this.user = user; }
public void tweet(String tweet) { api.postTweet(user,
tweet);
}
}
Tweeter tweeter = new Tweeter("JakeWharton"); tweeter.tweet("Hello!");
Tweeter tweeter = new Tweeter("JakeWharton"); tweeter.tweet("Hello!");
Timeline timeline = new Timeline("JakeWharton"); timeline.loadMore(20);
for (Tweet tweet : timeline.get()) {
System.out.println(tweet); }
public class Timeline {
private final List<Tweet> cache =
new ArrayList<>();
private final TwitterApi api =
new TwitterApi(new OkHttpClient());
private final String user;
public Timeline(String user) { this.user = user;
}
public List<Tweet> get() { /* ... */ }
public void loadMore(int amount) { /* ... */ } }
public class Timeline {
private final List<Tweet> cache =
new ArrayList<>();
private final TwitterApi api;
private final String user;
public Timeline(TwitterApi api, String user) { this.user =
user;
this.api = api;
}
public List<Tweet> get() { /* ... */ }
public void loadMore(int amount) { /* ... */ } }
public class Timeline {
private final List<Tweet> cache =
new ArrayList<>();
private final TwitterApi api;
private final String user;
public Timeline(TwitterApi api, String user) { this.user =
user;
this.api = api;
}
public List<Tweet> get() { /* ... */ }
public void loadMore(int amount) { /* ... */ } }
public class Tweeter { private final TwitterApi api =
new TwitterApi(new OkHttpClient());
public Tweeter(String user) { this.user = user; }
public void tweet(String tweet) { api.postTweet(user,
tweet);
}
}
public class Tweeter { private final TwitterApi api;
public Tweeter(TwitterApi api, String user) { this.user =
user;
this.api = api; }
public void tweet(String tweet) { api.postTweet(user,
tweet);
}
}
public class Tweeter { private final TwitterApi api;
public Tweeter(TwitterApi api, String user) { this.user =
user;
this.api = api; }
public void tweet(String tweet) { api.postTweet(user,
tweet);
}
}
Tweeter tweeter = new Tweeter("JakeWharton"); tweeter.tweet("Hello!");
Timeline timeline = new Timeline("JakeWharton"); timeline.loadMore(20);
for (Tweet tweet : timeline.get()) {
System.out.println(tweet); }
OkHttpClient client = new OkHttpClient(); TwitterApi api = new
TwitterApi(client); String user = "Jake Wharton";
Tweeter tweeter = new Tweeter(api, user); tweeter.tweet("Hello!");
Timeline timeline = new Timeline(api, user); timeline.loadMore(20);
for (Tweet tweet : timeline.get()) {
System.out.println(tweet); }
OkHttpClient client = new OkHttpClient(); TwitterApi api = new
TwitterApi(client); String user = "Jake Wharton";
Tweeter tweeter = new Tweeter(api, user); tweeter.tweet("Hello!");
Timeline timeline = new Timeline(api, user); timeline.loadMore(20);
for (Tweet tweet : timeline.get()) { System.out.println(tweet); }
Tweeter
Tiwtter
API
Network
Client
Dependency Injection
Twitter App
•Timeline
•Tweeter
Tiwtter API
Network
Client
Dependency Injection
OkHttpClient client = new OkHttpClient(); TwitterApi api = new
TwitterApi(client); String user = "Jake Wharton";
Tweeter tweeter = new Tweeter(api, user); tweeter.tweet("Hello!");
Timeline timeline = new Timeline(api, user); timeline.loadMore(20);
for (Tweet tweet : timeline.get()) { System.out.println(tweet); }
Как избежать этого?
 Guice
 Dagger (v1)
Немного истории
 Граф объектов проверяется в рантайме
 Большое количество рефлексии
 Медленная инициализация
Guice
 Использование FQCN в качестве ключей при
хранении элементов графа
 Использование рефлексии
Dagger (v1)
 Разработан Java Core Libraries Team
 Compile time анализ графа зависимостей
 Отсутствие рефлексии
 Совместимость с ProGuard
Dagger v2
 @Module + @Provides: для удовлетворения
зависимтостей
 @Inject: для запроса зависимостей
 @Component: соединяет все это вместе
Dagger API
 Модули – классы аннотированные
@Module, содержащие методы
аннотированные @Provides
Удовлетворение
зависимостей
public class NetworkModule {
OkHttpClient provideOkHttpClient() { return new
OkHttpClient();
}
TwitterApi provideTwitterApi(OkHttpClient client) {
return new TwitterApi(client); } }
@Module
public class NetworkModule { @Provides
OkHttpClient provideOkHttpClient() { return new
OkHttpClient();
}
@Provides
TwitterApi provideTwitterApi(OkHttpClient client) {
return new TwitterApi(client); } }
@Module
public class NetworkModule { @Provides @Singleton
OkHttpClient provideOkHttpClient() { return new
OkHttpClient();
}
@Provides @Singleton
TwitterApi provideTwitterApi(OkHttpClient client) {
return new TwitterApi(client); } }
Удовлетворение
зависимостей
OkHttpClient NetworkModule#provideOkHttpClient
TwitterApi NetworkModule#provideTwitterApi
Удовлетворение
зависимостей
OkHttpClient NetworkModule#provideOkHttpClient
TwitterApi NetworkModule#provideTwitterApi
Tweeter NetworkModule#provideTweeter
Timeline NetworkModule#provideTimeline
 Injection в конструктор
 Injection в поле
 Injection в метод
Типы injection
 @Inject на единственном конструкторе
 Параметры конструктора – зависимости
 Зависимости можно хранить в приватных
переменных
 Неявно делает класс доступным для
последующего инжекта
Injection в конструктор
public class TwitterApplication { private final Tweeter tweeter;
private final Timeline timeline;
@Inject public TwitterApplication(Tweeter tweeter, Timeline
timeline) {
this.tweeter = tweeter; this.timeline =
timeline;
}
// ... }
@Module
public class NetworkModule { @Provides @Singleton
OkHttpClient provideOkHttpClient() { return new
OkHttpClient();
}
@Provides @Singleton
TwitterApi provideTwitterApi(OkHttpClient client) {
return new TwitterApi(client); } }
public class TwitterApi {
private final OkHttpClient client;
@Inject
public TwitterApi(OkHttpClient client) { this.client
= client;
}
public void postTweet(String user, String tweet) {
Request request = //...
client.newCall(request).execute();
} }
@Singleton
public class TwitterApi {
private final OkHttpClient client;
@Inject
public TwitterApi(OkHttpClient client) { this.client
= client;
}
public void postTweet(String user, String tweet) {
Request request = //...
client.newCall(request).execute();
} }
 @Inject над каждой зависимостью
 Поля не могут быть private или final
 Объект ответственен за процесс инжекта
 Единственный способ инъектить
зависимости в объекты созданием которых
управляем не мы
Injection в поле
public class TwitterActivity extends Activity { @Inject Tweeter tweeter;
@Inject Timeline timeline;
// ... }
 Мост между модулями и получателями
зависимостей
 Инжектор
Components
@Singleton
@Component(modules = { NetworkModule.class,
TwitterModule.class,
})
public interface TwitterComponent {
Tweeter tweeter();
void inject(TwitterActivity activity);
}
public class TwitterActivity extends Activity { @Inject Tweeter tweeter;
@Inject Timeline timeline;
public void onCreate(Bundle savedInstanceState) {
Dagger_TwitterComponent.builder()
.build().inject(this);
}
// ... }
 Linked.in/in/tagakov
Вопросы?

More Related Content

Similar to Владимир Тагаков. Dagger2: dependency injection in Android

Working with API
Working with APIWorking with API
Working with APIMad Devs
 
Тестирование Web API
Тестирование Web APIТестирование Web API
Тестирование Web APIByndyusoft
 
AIDL в современном мире, Виктор Лапин. 8 июня, 2019
AIDL в современном мире, Виктор Лапин. 8 июня, 2019AIDL в современном мире, Виктор Лапин. 8 июня, 2019
AIDL в современном мире, Виктор Лапин. 8 июня, 2019Mail.ru Group
 
Киллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/awaitКиллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/awaitByndyusoft
 
Codefest-2015 Reactive Streams
Codefest-2015 Reactive StreamsCodefest-2015 Reactive Streams
Codefest-2015 Reactive StreamsAlexey Romanchuk
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программированияguestfc8ae0
 
Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Noveo
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.Igor Shkulipa
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыPlatonov Sergey
 
Лекция 1 Практика
Лекция 1 ПрактикаЛекция 1 Практика
Лекция 1 ПрактикаVictor Kulikov
 
Mikhail Valkov_Antipatterns
Mikhail Valkov_AntipatternsMikhail Valkov_Antipatterns
Mikhail Valkov_AntipatternsCiklum
 

Similar to Владимир Тагаков. Dagger2: dependency injection in Android (13)

Working with API
Working with APIWorking with API
Working with API
 
Thread
ThreadThread
Thread
 
Тестирование Web API
Тестирование Web APIТестирование Web API
Тестирование Web API
 
AIDL в современном мире, Виктор Лапин. 8 июня, 2019
AIDL в современном мире, Виктор Лапин. 8 июня, 2019AIDL в современном мире, Виктор Лапин. 8 июня, 2019
AIDL в современном мире, Виктор Лапин. 8 июня, 2019
 
Киллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/awaitКиллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/await
 
Codefest-2015 Reactive Streams
Codefest-2015 Reactive StreamsCodefest-2015 Reactive Streams
Codefest-2015 Reactive Streams
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 
Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансы
 
Лекция 1 Практика
Лекция 1 ПрактикаЛекция 1 Практика
Лекция 1 Практика
 
Mikhail Valkov_Antipatterns
Mikhail Valkov_AntipatternsMikhail Valkov_Antipatterns
Mikhail Valkov_Antipatterns
 
java
javajava
java
 

More from Mail.ru Group

Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Mail.ru Group
 
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...Mail.ru Group
 
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинДругая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинMail.ru Group
 
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Mail.ru Group
 
Управление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовУправление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовMail.ru Group
 
DAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваMail.ru Group
 
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...Mail.ru Group
 
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...Mail.ru Group
 
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidiaRAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidiaMail.ru Group
 
WebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоWebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоMail.ru Group
 
AMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковAMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковMail.ru Group
 
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковКак мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковMail.ru Group
 
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Mail.ru Group
 
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиМетапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиMail.ru Group
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupMail.ru Group
 
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Mail.ru Group
 
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Mail.ru Group
 
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Mail.ru Group
 
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Mail.ru Group
 
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Mail.ru Group
 

More from Mail.ru Group (20)

Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
 
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
 
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинДругая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
 
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
 
Управление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовУправление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон Викторов
 
DAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга Свиридова
 
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
 
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
 
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidiaRAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
 
WebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоWebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий Остапенко
 
AMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковAMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей Пешков
 
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковКак мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
 
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
 
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиМетапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
 
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
 
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
 
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
 
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
 

Владимир Тагаков. Dagger2: dependency injection in Android

  • 1. { Dagger2: dependency injection in Android Vladimir Tagakov
  • 3.  Не звоните нам, мы сами вам перезвоним. Hollywood Principle
  • 4.  Это паттерн проектирования, а не библиотека.  В каждом проекте используется DI Dependency Injection
  • 6. public class Tweeter { public void tweet(String tweet) { TwitterApi api = new TwitterApi(); api.postTweet("JakeWharton", tweet); } } public class TwitterApi { public void postTweet(String user, String tweet) { OkHttpClient client = new OkHttpClient(); Request request = //... client.newCall(request).execute(); } }
  • 7. public class TwitterApi { private final OkHttpClient client = new OkHttpClient(); public void postTweet(String user, String tweet) { Request request = //... client.newCall(request).execute(); } }
  • 8. public class TwitterApi { private final OkHttpClient client = new OkHttpClient(); public void postTweet(String user, String tweet) { Request request = //... client.newCall(request).execute(); } }
  • 9. public class TwitterApi { private final OkHttpClient client; public TwitterApi(OkHttpClient client) { this.client = client; } public void postTweet(String user, String tweet) { Request request = //... client.newCall(request).execute(); } }
  • 10. public class Tweeter { public void tweet(String tweet) { TwitterApi api = new TwitterApi(); api.postTweet("JakeWharton", tweet); } }
  • 11. public class Tweeter { public void tweet(String tweet) { TwitterApi api = new TwitterApi( new OkHttpClient() ); api.postTweet("JakeWharton", tweet); } }
  • 12. public class Tweeter { public void tweet(String tweet) { TwitterApi api = new TwitterApi( new OkHttpClient() ); api.postTweet("JakeWharton", tweet); } }
  • 13. public class Tweeter { private final TwitterApi api = new TwitterApi(new OkHttpClient()); public void tweet(String tweet) { api.postTweet("JakeWharton", tweet); } }
  • 14. public class Tweeter { private final TwitterApi api = new TwitterApi(new OkHttpClient()); public void tweet(String tweet) { api.postTweet("JakeWharton", tweet); } }
  • 15. public class Tweeter { private final TwitterApi api = new TwitterApi(new OkHttpClient()); public Tweeter(String user) { this.user = user; } public void tweet(String tweet) { api.postTweet(user, tweet); } }
  • 16. Tweeter tweeter = new Tweeter("JakeWharton"); tweeter.tweet("Hello!");
  • 17. Tweeter tweeter = new Tweeter("JakeWharton"); tweeter.tweet("Hello!"); Timeline timeline = new Timeline("JakeWharton"); timeline.loadMore(20); for (Tweet tweet : timeline.get()) { System.out.println(tweet); }
  • 18. public class Timeline { private final List<Tweet> cache = new ArrayList<>(); private final TwitterApi api = new TwitterApi(new OkHttpClient()); private final String user; public Timeline(String user) { this.user = user; } public List<Tweet> get() { /* ... */ } public void loadMore(int amount) { /* ... */ } }
  • 19. public class Timeline { private final List<Tweet> cache = new ArrayList<>(); private final TwitterApi api; private final String user; public Timeline(TwitterApi api, String user) { this.user = user; this.api = api; } public List<Tweet> get() { /* ... */ } public void loadMore(int amount) { /* ... */ } }
  • 20. public class Timeline { private final List<Tweet> cache = new ArrayList<>(); private final TwitterApi api; private final String user; public Timeline(TwitterApi api, String user) { this.user = user; this.api = api; } public List<Tweet> get() { /* ... */ } public void loadMore(int amount) { /* ... */ } }
  • 21. public class Tweeter { private final TwitterApi api = new TwitterApi(new OkHttpClient()); public Tweeter(String user) { this.user = user; } public void tweet(String tweet) { api.postTweet(user, tweet); } }
  • 22. public class Tweeter { private final TwitterApi api; public Tweeter(TwitterApi api, String user) { this.user = user; this.api = api; } public void tweet(String tweet) { api.postTweet(user, tweet); } }
  • 23. public class Tweeter { private final TwitterApi api; public Tweeter(TwitterApi api, String user) { this.user = user; this.api = api; } public void tweet(String tweet) { api.postTweet(user, tweet); } }
  • 24. Tweeter tweeter = new Tweeter("JakeWharton"); tweeter.tweet("Hello!"); Timeline timeline = new Timeline("JakeWharton"); timeline.loadMore(20); for (Tweet tweet : timeline.get()) { System.out.println(tweet); }
  • 25. OkHttpClient client = new OkHttpClient(); TwitterApi api = new TwitterApi(client); String user = "Jake Wharton"; Tweeter tweeter = new Tweeter(api, user); tweeter.tweet("Hello!"); Timeline timeline = new Timeline(api, user); timeline.loadMore(20); for (Tweet tweet : timeline.get()) { System.out.println(tweet); }
  • 26. OkHttpClient client = new OkHttpClient(); TwitterApi api = new TwitterApi(client); String user = "Jake Wharton"; Tweeter tweeter = new Tweeter(api, user); tweeter.tweet("Hello!"); Timeline timeline = new Timeline(api, user); timeline.loadMore(20); for (Tweet tweet : timeline.get()) { System.out.println(tweet); }
  • 29. OkHttpClient client = new OkHttpClient(); TwitterApi api = new TwitterApi(client); String user = "Jake Wharton"; Tweeter tweeter = new Tweeter(api, user); tweeter.tweet("Hello!"); Timeline timeline = new Timeline(api, user); timeline.loadMore(20); for (Tweet tweet : timeline.get()) { System.out.println(tweet); } Как избежать этого?
  • 30.  Guice  Dagger (v1) Немного истории
  • 31.  Граф объектов проверяется в рантайме  Большое количество рефлексии  Медленная инициализация Guice
  • 32.  Использование FQCN в качестве ключей при хранении элементов графа  Использование рефлексии Dagger (v1)
  • 33.  Разработан Java Core Libraries Team  Compile time анализ графа зависимостей  Отсутствие рефлексии  Совместимость с ProGuard Dagger v2
  • 34.  @Module + @Provides: для удовлетворения зависимтостей  @Inject: для запроса зависимостей  @Component: соединяет все это вместе Dagger API
  • 35.  Модули – классы аннотированные @Module, содержащие методы аннотированные @Provides Удовлетворение зависимостей
  • 36. public class NetworkModule { OkHttpClient provideOkHttpClient() { return new OkHttpClient(); } TwitterApi provideTwitterApi(OkHttpClient client) { return new TwitterApi(client); } }
  • 37. @Module public class NetworkModule { @Provides OkHttpClient provideOkHttpClient() { return new OkHttpClient(); } @Provides TwitterApi provideTwitterApi(OkHttpClient client) { return new TwitterApi(client); } }
  • 38. @Module public class NetworkModule { @Provides @Singleton OkHttpClient provideOkHttpClient() { return new OkHttpClient(); } @Provides @Singleton TwitterApi provideTwitterApi(OkHttpClient client) { return new TwitterApi(client); } }
  • 41.  Injection в конструктор  Injection в поле  Injection в метод Типы injection
  • 42.  @Inject на единственном конструкторе  Параметры конструктора – зависимости  Зависимости можно хранить в приватных переменных  Неявно делает класс доступным для последующего инжекта Injection в конструктор
  • 43. public class TwitterApplication { private final Tweeter tweeter; private final Timeline timeline; @Inject public TwitterApplication(Tweeter tweeter, Timeline timeline) { this.tweeter = tweeter; this.timeline = timeline; } // ... }
  • 44. @Module public class NetworkModule { @Provides @Singleton OkHttpClient provideOkHttpClient() { return new OkHttpClient(); } @Provides @Singleton TwitterApi provideTwitterApi(OkHttpClient client) { return new TwitterApi(client); } }
  • 45. public class TwitterApi { private final OkHttpClient client; @Inject public TwitterApi(OkHttpClient client) { this.client = client; } public void postTweet(String user, String tweet) { Request request = //... client.newCall(request).execute(); } }
  • 46. @Singleton public class TwitterApi { private final OkHttpClient client; @Inject public TwitterApi(OkHttpClient client) { this.client = client; } public void postTweet(String user, String tweet) { Request request = //... client.newCall(request).execute(); } }
  • 47.  @Inject над каждой зависимостью  Поля не могут быть private или final  Объект ответственен за процесс инжекта  Единственный способ инъектить зависимости в объекты созданием которых управляем не мы Injection в поле
  • 48. public class TwitterActivity extends Activity { @Inject Tweeter tweeter; @Inject Timeline timeline; // ... }
  • 49.  Мост между модулями и получателями зависимостей  Инжектор Components
  • 50. @Singleton @Component(modules = { NetworkModule.class, TwitterModule.class, }) public interface TwitterComponent { Tweeter tweeter(); void inject(TwitterActivity activity); }
  • 51. public class TwitterActivity extends Activity { @Inject Tweeter tweeter; @Inject Timeline timeline; public void onCreate(Bundle savedInstanceState) { Dagger_TwitterComponent.builder() .build().inject(this); } // ... }