В статье рассмотрим возможности использования Dagger 2 для реализации DI под ОС Android. Рассмотрим основные части, реализующие данный механизм в Dagger 2, на простом примере.

Подготовка

Первым делом создадим новый проект в Android Studio.
New-Project

New-Project-2

 

New-Project-3

 

Теперь необходимо добавить в Gradle зависимости на Dagger 2. Для начала в build скрипте проекта добавим зависимость на android-apt. Эта библиотека необходима для корректной авто-генерации кода из аннотаций в Android Studio.

Далее добавим зависимости на сам Dagger 2.

Как работает Dagger 2?

В основе работы Dagger 2 лежат аннотации стандарта JSR-330. В самой терминологии Dagger 2 можно выделить 3 ключевых слова:

  • Зависимости
  • Модули
  • Компоненты

Которые выражаются в следующую формулу: “Компоненты предоставляют требуемые зависимости, которые определены в модулях.”

Зависимости

Dagger 2 поддерживает три способа внедрения зависимости:

  • Field injection
  • Constructor injection
  • Method injection

Нас интересуют первые два варианта, но так как в Android экземпляры Activity или Service создаются самой средой, то мы не сможем использовать Constructor injection. Поэтому, для внедрения зависимостей в эти классы, необходимо добавить аннотацию @Inject для полей требующих зависимости, а далее в методе onCreate с использованием определенной структуры кода добавить зависимость. Об этом ниже.

Модули

Но сперва определим, где конфигурировать бины. В Dagger 2 для этих целей используются т.н. модули. Модуль инкапсулирует в себе знания о том как необходимо конструировать бины. Сам из себя модуль представляет класс с аннотацией @Module, в котором  описываются методы с аннотацией @Provides. Именно в этих методах содержится основная логика конструирования бинов.

Модуль может содержать в себе описание другого модуля, для этого в параметр аннотации @Module нужно перечислить классы дополнительных модулей. Для тех кто работал со Spring можно провести анналогию модуля и класса конфигурации.

Компоненты

Компоненты представляют собой интерфейсы (или абстрактные классы), у которых могут быть два вида методов:

  • методы возвращающие объект, но не имеющие параметров
  • методы возвращающие void и могут содержать один параметр

Первые служат для получения бинов, вторые для установления зависимостей внутрь класса параметра.

В этом коде в аннотации @Component мы указали какие модули использовать в качестве источника бинов.

Связка с Android

Теперь необходимо понять в каком месте проинициализировать наши компоненты в Android. Согласно специфике ОС основная единица приложения это класс Application, поэтому создадим собственную реализацию этого класса.

Не забудем добавить в Manifest информацию о том, что у нас собственный класс Application.

В методе onCreate соберем наш компонент.

Apt позволяет Dagger 2 сгенерировать собственную имплементацию нашего компонента. Нам достаточно лишь добавить в начале названия нашего интерфейса Dagger.

И у этой имплементации уже есть методы ожидающие наши модули:

Теперь остается лишь добавить доступ к компоненту из любой точки программы. Добавим следующий метод

В классе MainActivity определим два поля ожидающих внедрения бинов.

Чтобы внедрить зависимости в поля с аннотацией @Inject в метод onCreate добавим следующий код:

Видно, что используется компонент и объявленный в нем нами метод inject.

Воспользуемся второй возможностью нашего компонента и достанем из контейнера Dagger 2 бин Speaker.

Модифицируем Layout и разместим наши информацию из бинов.

Получим следующий результат.

Project-result

 

Ссылка на GitHub

Использование Dagger 2 в Android приложении.
Метки:        

10 thoughts on “Использование Dagger 2 в Android приложении.

Добавить комментарий для Никита Михайлов Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">