gtug almaty. dependency injection в android

109
Dependency Injection в Android Кирилл Бояршинов Android Developer, Live Typing Almaty Google Technology User Group

Upload: madina-kamzina

Post on 05-Dec-2014

99 views

Category:

Education


0 download

DESCRIPTION

Об использовании подхода внедрения зависимостей (Dependency Injection) в разработке Android-приложений. Зачем это нужно и какие преимущества дает. А так же о том, как построить на основе DI гибкую архитектуру приложения. Ивент здесь: https://plus.google.com/u/0/events/c6bh3b26o29g4k2fom09636fn00

TRANSCRIPT

Page 1: GTUG Almaty. Dependency Injection в Android

Dependency  Injection  в  Android  

Кирилл  Бояршинов  

Android  Developer,  Live  Typing

Almaty  Google  Technology  User  Group

Page 2: GTUG Almaty. Dependency Injection в Android

Almaty  Google   Technology  User  Group

Page 3: GTUG Almaty. Dependency Injection в Android
Page 4: GTUG Almaty. Dependency Injection в Android

О  себе

Page 5: GTUG Almaty. Dependency Injection в Android

О  себе• Закончил  ОмГТУ  (АСОИУ)

Page 6: GTUG Almaty. Dependency Injection в Android

О  себе• Закончил  ОмГТУ  (АСОИУ)• Делаю  крутые  приложения  в  Live  Typing:  • КоммерсантЪ  • Breath  Alcohol  Monitor  (by  Lapka)  • PrizeWord  сканворды  • Опросы  Департамента  транспорта  Москвы

Page 7: GTUG Almaty. Dependency Injection в Android

О  себе• Закончил  ОмГТУ  (АСОИУ)• Делаю  крутые  приложения  в  Live  Typing:  • КоммерсантЪ  • Breath  Alcohol  Monitor  (by  Lapka)  • PrizeWord  сканворды  • Опросы  Департамента  транспорта  Москвы

• Участник  GDG  Omsk

Page 8: GTUG Almaty. Dependency Injection в Android

О  себе• Закончил  ОмГТУ  (АСОИУ)• Делаю  крутые  приложения  в  Live  Typing:  • КоммерсантЪ  • Breath  Alcohol  Monitor  (by  Lapka)  • PrizeWord  сканворды  • Опросы  Департамента  транспорта  Москвы

• Участник  GDG  Omsk• Огранизатор  Android  Developers  Omsk

Page 9: GTUG Almaty. Dependency Injection в Android

О  себе• Закончил  ОмГТУ  (АСОИУ)• Делаю  крутые  приложения  в  Live  Typing:  • КоммерсантЪ  • Breath  Alcohol  Monitor  (by  Lapka)  • PrizeWord  сканворды  • Опросы  Департамента  транспорта  Москвы

• Участник  GDG  Omsk• Огранизатор  Android  Developers  Omsk• Увлечения:  космос,  спорт,  open  source

Page 10: GTUG Almaty. Dependency Injection в Android

http://ltst.ru  

Page 11: GTUG Almaty. Dependency Injection в Android

Внедрение  зависимостей    (Dependency  Injection)

Page 12: GTUG Almaty. Dependency Injection в Android

Внедрение  зависимостей    (Dependency  Injection)

• Набор  паттернов  и  принципов  разработки  ПО

Page 13: GTUG Almaty. Dependency Injection в Android

Внедрение  зависимостей    (Dependency  Injection)

• Набор  паттернов  и  принципов  разработки  ПО• Позволяют  писать  слабосвязный  код

Page 14: GTUG Almaty. Dependency Injection в Android

Внедрение  зависимостей    (Dependency  Injection)

• Набор  паттернов  и  принципов  разработки  ПО• Позволяют  писать  слабосвязный  код• Является  разновидностью  более  глобального  принципа  инверсии  управления  (Inversion  of  Control)  (by  M.Fowler)

Page 15: GTUG Almaty. Dependency Injection в Android

Внедрение  зависимостей    (Dependency  Injection)

• Набор  паттернов  и  принципов  разработки  ПО• Позволяют  писать  слабосвязный  код• Является  разновидностью  более  глобального  принципа  инверсии  управления  (Inversion  of  Control)  (by  M.Fowler)

• Разделяет  порождение  компонентов,  от  тех,  кто  их  запрашивает

Component Service

Page 16: GTUG Almaty. Dependency Injection в Android
Page 17: GTUG Almaty. Dependency Injection в Android
Page 18: GTUG Almaty. Dependency Injection в Android
Page 19: GTUG Almaty. Dependency Injection в Android

Assembler

Component Service  <<interface>>

ServiceImpl

<<request>>

<<create>>

<<inject>>

Принцип DI

Page 20: GTUG Almaty. Dependency Injection в Android

public class Component { private final Service service; public Component(Service service) { this.service = service; } public void doStuff() { return service.doStuff(); } }

Page 21: GTUG Almaty. Dependency Injection в Android

JSR-­‐330

• @Inject  • @Named  • @Qualifier  • @Scoped  • @Singleton

Page 22: GTUG Almaty. Dependency Injection в Android

Java  Frameworks

• Spring  • Guice  • PicoContainer  • Avalon  • …

Page 24: GTUG Almaty. Dependency Injection в Android
Page 25: GTUG Almaty. Dependency Injection в Android

Цели  “ObjectGraph”

Page 26: GTUG Almaty. Dependency Injection в Android

Цели  “ObjectGraph”

• Статический  анализ  всех  зависимостей  и  инъекций

Page 27: GTUG Almaty. Dependency Injection в Android

Цели  “ObjectGraph”

• Статический  анализ  всех  зависимостей  и  инъекций

• Compile-­‐time  валидация  и  поиск  ошибок

Page 28: GTUG Almaty. Dependency Injection в Android

Цели  “ObjectGraph”

• Статический  анализ  всех  зависимостей  и  инъекций

• Compile-­‐time  валидация  и  поиск  ошибок• Избавиться  от  рефлексии

Page 29: GTUG Almaty. Dependency Injection в Android

Цели  “ObjectGraph”

• Статический  анализ  всех  зависимостей  и  инъекций

• Compile-­‐time  валидация  и  поиск  ошибок• Избавиться  от  рефлексии• Незначительные  затраты  памяти

Page 30: GTUG Almaty. Dependency Injection в Android

Разработка  “ObjectGraph”

Page 31: GTUG Almaty. Dependency Injection в Android

Разработка  “ObjectGraph”• 5  недель  работы  Jesse  Wilson

Page 32: GTUG Almaty. Dependency Injection в Android

Разработка  “ObjectGraph”• 5  недель  работы  Jesse  Wilson• Bob  Lee  в  качестве  технического  советника

Page 33: GTUG Almaty. Dependency Injection в Android

Разработка  “ObjectGraph”• 5  недель  работы  Jesse  Wilson• Bob  Lee  в  качестве  технического  советника• “Огромный”  boolean  switch  в  приложениях  Square

Page 34: GTUG Almaty. Dependency Injection в Android

Разработка  “ObjectGraph”• 5  недель  работы  Jesse  Wilson• Bob  Lee  в  качестве  технического  советника• “Огромный”  boolean  switch  в  приложениях  Square• Через  2  недели  Guice  был  полностью  удален

Page 35: GTUG Almaty. Dependency Injection в Android

Разработка  “ObjectGraph”• 5  недель  работы  Jesse  Wilson• Bob  Lee  в  качестве  технического  советника• “Огромный”  boolean  switch  в  приложениях  Square• Через  2  недели  Guice  был  полностью  удален• Переименован  в  Dagger

Page 36: GTUG Almaty. Dependency Injection в Android

Разработка  “ObjectGraph”• 5  недель  работы  Jesse  Wilson• Bob  Lee  в  качестве  технического  советника• “Огромный”  boolean  switch  в  приложениях  Square• Через  2  недели  Guice  был  полностью  удален• Переименован  в  Dagger• Выложен  в  открытый  доступ  -­‐  http://github.com/square/dagger

Page 37: GTUG Almaty. Dependency Injection в Android

Dagger

Page 38: GTUG Almaty. Dependency Injection в Android

Dagger• ObjectGraph  -­‐  центральный  менеджер  зависимостей  и  инжектор

Page 39: GTUG Almaty. Dependency Injection в Android

Dagger• ObjectGraph  -­‐  центральный  менеджер  зависимостей  и  инжектор

• @Module  +  @Provides  -­‐  механизм  предоставления  зависимостей

Page 40: GTUG Almaty. Dependency Injection в Android

Dagger• ObjectGraph  -­‐  центральный  менеджер  зависимостей  и  инжектор

• @Module  +  @Provides  -­‐  механизм  предоставления  зависимостей

• @Inject  -­‐  механизм  для  запроса  зависимостей

Page 41: GTUG Almaty. Dependency Injection в Android

Dagger• ObjectGraph  -­‐  центральный  менеджер  зависимостей  и  инжектор

• @Module  +  @Provides  -­‐  механизм  предоставления  зависимостей

• @Inject  -­‐  механизм  для  запроса  зависимостей• И  еще  немного  сахара  и  магии  :)

Page 42: GTUG Almaty. Dependency Injection в Android

Предоставление  зависимостей

Page 43: GTUG Almaty. Dependency Injection в Android

Предоставление  зависимостей• Модули  -­‐  классы,  предоставляющие  зависимости

Page 44: GTUG Almaty. Dependency Injection в Android

Предоставление  зависимостей• Модули  -­‐  классы,  предоставляющие  зависимости• Для  этого  у  класса-­‐модуля  используется  аннотация  @Module

Page 45: GTUG Almaty. Dependency Injection в Android

Предоставление  зависимостей• Модули  -­‐  классы,  предоставляющие  зависимости• Для  этого  у  класса-­‐модуля  используется  аннотация  @Module

• Аннотация  @Provides  у  метода  указывает,  что  возвращаемый  тип  -­‐  зависимость

Page 46: GTUG Almaty. Dependency Injection в Android

Предоставление  зависимостей• Модули  -­‐  классы,  предоставляющие  зависимости• Для  этого  у  класса-­‐модуля  используется  аннотация  @Module

• Аннотация  @Provides  у  метода  указывает,  что  возвращаемый  тип  -­‐  зависимость

• @Module  и  @Provides  предназначены  использоваться  вместе

Page 47: GTUG Almaty. Dependency Injection в Android

@Module public class ServiceModule { @Provides public Service provideService() { return new ServiceImpl(); } }

Page 48: GTUG Almaty. Dependency Injection в Android

Инъекция  зависимостей

Page 49: GTUG Almaty. Dependency Injection в Android

Инъекция  зависимостей• Инъекция  в  конструктор:

Page 50: GTUG Almaty. Dependency Injection в Android

Инъекция  зависимостей• Инъекция  в  конструктор:• @Inject  у  конструктора

Page 51: GTUG Almaty. Dependency Injection в Android

Инъекция  зависимостей• Инъекция  в  конструктор:• @Inject  у  конструктора• Все  аргументы  конструктора  -­‐  зависимости

Page 52: GTUG Almaty. Dependency Injection в Android

Инъекция  зависимостей• Инъекция  в  конструктор:• @Inject  у  конструктора• Все  аргументы  конструктора  -­‐  зависимости• Зависимости  могут  быть  сохранены  в  private  и  final  полях

Page 53: GTUG Almaty. Dependency Injection в Android

Инъекция  зависимостей• Инъекция  в  конструктор:• @Inject  у  конструктора• Все  аргументы  конструктора  -­‐  зависимости• Зависимости  могут  быть  сохранены  в  private  и  final  полях

• Dagger  должен  создавать  объект

Page 54: GTUG Almaty. Dependency Injection в Android

Инъекция  зависимостей• Инъекция  в  конструктор:• @Inject  у  конструктора• Все  аргументы  конструктора  -­‐  зависимости• Зависимости  могут  быть  сохранены  в  private  и  final  полях

• Dagger  должен  создавать  объект• Для  такого  объекта  не  требуется  @Provides  (т.е.  его  можно  использовать  как  зависимость)

Page 55: GTUG Almaty. Dependency Injection в Android

public class Component { private final Service service; @Inject public Component(Service service) { this.service = service; } public void doStuff() { return service.doStuff(); } }

Page 56: GTUG Almaty. Dependency Injection в Android

Инъекция  зависимостей

Page 57: GTUG Almaty. Dependency Injection в Android

Инъекция  зависимостей• Инъекция  в  поле:

Page 58: GTUG Almaty. Dependency Injection в Android

Инъекция  зависимостей• Инъекция  в  поле:• @Inject  у  полей-­‐зависимостей

Page 59: GTUG Almaty. Dependency Injection в Android

Инъекция  зависимостей• Инъекция  в  поле:• @Inject  у  полей-­‐зависимостей• Поля  не  могут  быть  private  или  final

Page 60: GTUG Almaty. Dependency Injection в Android

Инъекция  зависимостей• Инъекция  в  поле:• @Inject  у  полей-­‐зависимостей• Поля  не  могут  быть  private  или  final• Инъекция  происходит  после  создания  объекта

Page 61: GTUG Almaty. Dependency Injection в Android

Инъекция  зависимостей• Инъекция  в  поле:• @Inject  у  полей-­‐зависимостей• Поля  не  могут  быть  private  или  final• Инъекция  происходит  после  создания  объекта• Чаще  всего  объект  ответственен  за  инъекцию  самого  себя

Page 62: GTUG Almaty. Dependency Injection в Android

public class Component { @Inject Service service; public Component() { Injector.inject(this); } public void doStuff() { return service.doStuff(); } }

Page 63: GTUG Almaty. Dependency Injection в Android

ObjectGraph

Page 64: GTUG Almaty. Dependency Injection в Android

ObjectGraph• Центральный  контроллер  модулей  (зависимотей)

Page 65: GTUG Almaty. Dependency Injection в Android

ObjectGraph• Центральный  контроллер  модулей  (зависимотей)• Инжектор

Page 66: GTUG Almaty. Dependency Injection в Android

ObjectGraph• Центральный  контроллер  модулей  (зависимотей)• Инжектор• Может  быть  расширен  путем  добавления  других  модулей.  

Page 67: GTUG Almaty. Dependency Injection в Android

ObjectGraph• Центральный  контроллер  модулей  (зависимотей)• Инжектор• Может  быть  расширен  путем  добавления  других  модулей.  

• Модули  могут  переопределять  зависимости  из  других  модулей  (только  1  раз)

Page 68: GTUG Almaty. Dependency Injection в Android

ObjectGraph og = ObjectGraph.create( new NetworkModule(), new TwitterModule("naghtarr") ); '// Using constructor injection: TweeterApp app = og.get(TweeterApp.class); '// Using field injection: TweeterApp app = new TweeterApp(); og.inject(app);

Page 69: GTUG Almaty. Dependency Injection в Android

Листинг  объектов  для  инъекций

Page 70: GTUG Almaty. Dependency Injection в Android

Листинг  объектов  для  инъекций

• Все  объекты  для  инъекции  должны  быть  перечислены  в  модуле

Page 71: GTUG Almaty. Dependency Injection в Android

Листинг  объектов  для  инъекций

• Все  объекты  для  инъекции  должны  быть  перечислены  в  модуле

• Используется  для  статического  анализа  зависимостей

Page 72: GTUG Almaty. Dependency Injection в Android

@Module public class ServiceModule { @Provides public Service provideService() { return new ServiceImpl(); } }

Page 73: GTUG Almaty. Dependency Injection в Android

@Module( injects = { Component.class } ) public class ServiceModule { @Provides public Service provideService() { return new ServiceImpl(); } }

Page 74: GTUG Almaty. Dependency Injection в Android

Как  пользоваться  в  Android

Page 75: GTUG Almaty. Dependency Injection в Android

Как  пользоваться  в  Android• Корневой  ObjectGraph  создается  в  подклассе  Application

Page 76: GTUG Almaty. Dependency Injection в Android

Как  пользоваться  в  Android• Корневой  ObjectGraph  создается  в  подклассе  Application

• Не  получится  использовать  инъекцию  в  конструктор  (объекты  создаются  ОС)

Page 77: GTUG Almaty. Dependency Injection в Android

Как  пользоваться  в  Android• Корневой  ObjectGraph  создается  в  подклассе  Application

• Не  получится  использовать  инъекцию  в  конструктор  (объекты  создаются  ОС)

• Используется  инъекция  в  поле  (в  Activity,  Fragment,  Service,  View)

Page 78: GTUG Almaty. Dependency Injection в Android

Как  пользоваться  в  Android• Корневой  ObjectGraph  создается  в  подклассе  Application

• Не  получится  использовать  инъекцию  в  конструктор  (объекты  создаются  ОС)

• Используется  инъекция  в  поле  (в  Activity,  Fragment,  Service,  View)

• Можно  делить  приложение  на  “области  видимости”  с  определенным  набором  модулей,  используя  метод  .plus()

Page 79: GTUG Almaty. Dependency Injection в Android

Демо

Page 80: GTUG Almaty. Dependency Injection в Android

Преимущества

Page 81: GTUG Almaty. Dependency Injection в Android

Преимущества• Mock-­‐режим  для  параллельной  и  быстрой  разработки  (module  override  +  gradle  flavours)

Page 82: GTUG Almaty. Dependency Injection в Android

Преимущества• Mock-­‐режим  для  параллельной  и  быстрой  разработки  (module  override  +  gradle  flavours)

• Тестовый  режим  для  отладки  и  функционального  тестирования  (module  override)

Page 83: GTUG Almaty. Dependency Injection в Android

Производительность

Page 84: GTUG Almaty. Dependency Injection в Android

Производительность• Генерация  кода  для  зависимостей  за  счет  Annotation  processing

Page 85: GTUG Almaty. Dependency Injection в Android

Производительность• Генерация  кода  для  зависимостей  за  счет  Annotation  processing

• Происходит  автоматически  при  компиляции

Page 86: GTUG Almaty. Dependency Injection в Android

Производительность• Генерация  кода  для  зависимостей  за  счет  Annotation  processing

• Происходит  автоматически  при  компиляции• Не  используется  рефлексия  (почти)

Page 87: GTUG Almaty. Dependency Injection в Android

Производительность• Генерация  кода  для  зависимостей  за  счет  Annotation  processing

• Происходит  автоматически  при  компиляции• Не  используется  рефлексия  (почти)• Удобно  для  отладки  и  для  разработчиков

Page 88: GTUG Almaty. Dependency Injection в Android

Будущее

Page 89: GTUG Almaty. Dependency Injection в Android

Будущее• Dagger  2  (разрабатывается  Google  и  Square)

Page 90: GTUG Almaty. Dependency Injection в Android

Будущее• Dagger  2  (разрабатывается  Google  и  Square)• Без  рефлексии…  совсем

Page 91: GTUG Almaty. Dependency Injection в Android

Будущее• Dagger  2  (разрабатывается  Google  и  Square)• Без  рефлексии…  совсем• Смерть  листингу  инъекций

Page 92: GTUG Almaty. Dependency Injection в Android

Будущее• Dagger  2  (разрабатывается  Google  и  Square)• Без  рефлексии…  совсем• Смерть  листингу  инъекций• http://goo.gl/7eTCJu  и  http://goo.gl/mW474Z

Page 93: GTUG Almaty. Dependency Injection в Android

Будущее• Dagger  2  (разрабатывается  Google  и  Square)• Без  рефлексии…  совсем• Смерть  листингу  инъекций• http://goo.gl/7eTCJu  и  http://goo.gl/mW474Z• Когда?  Скоро  :)

Page 94: GTUG Almaty. Dependency Injection в Android

Будущее• Dagger  2  (разрабатывается  Google  и  Square)• Без  рефлексии…  совсем• Смерть  листингу  инъекций• http://goo.gl/7eTCJu  и  http://goo.gl/mW474Z• Когда?  Скоро  :)

• Mortar  &  Flow  (http://goo.gl/8tlHkz)

Page 95: GTUG Almaty. Dependency Injection в Android

Будущее• Dagger  2  (разрабатывается  Google  и  Square)• Без  рефлексии…  совсем• Смерть  листингу  инъекций• http://goo.gl/7eTCJu  и  http://goo.gl/mW474Z• Когда?  Скоро  :)

• Mortar  &  Flow  (http://goo.gl/8tlHkz)• DI  для  UI  в  Android  (Dagger-­‐based)

Page 96: GTUG Almaty. Dependency Injection в Android

Демо

Page 98: GTUG Almaty. Dependency Injection в Android

Демо• u2020  (https://github.com/JakeWharton/u2020)

• u2020-­‐mortar  (https://github.com/lemonlabs/u2020-­‐mortar)

Page 99: GTUG Almaty. Dependency Injection в Android

Демо• u2020  (https://github.com/JakeWharton/u2020)

• u2020-­‐mortar  (https://github.com/lemonlabs/u2020-­‐mortar)

• u2020-­‐mvp  (https://github.com/LiveTyping/u2020-­‐mvp)  

Page 100: GTUG Almaty. Dependency Injection в Android

Собственный  опыт

Page 101: GTUG Almaty. Dependency Injection в Android

Android  в  Омске

Page 102: GTUG Almaty. Dependency Injection в Android

Android  в  Омске• События  GDG  Omsk  (DevFest,  хакатоны  и  пр.)

Page 103: GTUG Almaty. Dependency Injection в Android

Android  в  Омске• События  GDG  Omsk  (DevFest,  хакатоны  и  пр.)• События  +Android  Developers  Omsk

Page 104: GTUG Almaty. Dependency Injection в Android

Android  в  Омске• События  GDG  Omsk  (DevFest,  хакатоны  и  пр.)• События  +Android  Developers  Omsk• Доклады  на  IT-­‐субботниках,  конференциях  и  мини-­‐конференциях  :)

Page 105: GTUG Almaty. Dependency Injection в Android

DevFest  Omsk  2014

Page 106: GTUG Almaty. Dependency Injection в Android

DevFest  Omsk  2014

• 1-­‐2  ноября  2014

Page 107: GTUG Almaty. Dependency Injection в Android

DevFest  Omsk  2014

• 1-­‐2  ноября  2014• http://gdgomsk.github.io/devfest-­‐site/

Page 108: GTUG Almaty. Dependency Injection в Android

Спасибо  за  внимание

Almaty  Google  Technology  User  Group

www.ala-­‐gtug.org

Page 109: GTUG Almaty. Dependency Injection в Android

Вопросы?

Almaty  Google  Technology  User  Group

Кирилл  Бояршинов  [email protected]  [email protected]