Внедрение зависимостей Java: Dagger 1 или Dagger 2, что лучше?

Каковы преимущества Dagger 2 по сравнению с Кинжал 1?

Пока я нашел (только) 2:

  • Dagger 2 позволяет использовать обфускацию кода с помощью proguard
  • Dagger 2 быстрее (что не является большим преимуществом при использовании его для приложения Android, но, безусловно, важно, если вы используете его для какого-либо сервера)

В то же время я обнаружил один большой недостаток: вы не можете иметь переопределения модулей (@Module(overrides = true)) в Dagger 2, что сильно раздражает, по крайней мере, для меня - это было очень полезно для модульного тестирования.

Есть ли другие преимущества/недостатки?


person Ognyan    schedule 11.07.2015    source источник
comment
Не спрашивайте о: рекомендациях или сравнениях продуктов или услуг   -  person Selvin    schedule 11.07.2015
comment
Вы задали аналогичный вопрос здесь: stackoverflow.com/questions/31354735/. Я думаю, что этот пост должен быть редактированием того,   -  person Phantômaxx    schedule 11.07.2015
comment
@Selvin Такие вопросы иногда имеют большое значение для сообщества, потому что они привлекают внимание к общей проблеме, например, какой Dagger DI выбрать и почему? Прошу прощения за нарушение правила, которое вы процитировали, но также разрешены некоторые субъективные вопросы. Ожидается, что все субъективные вопросы будут конструктивными. Если ваш комментарий наберет больше голосов, чем текущий - я удалю вопрос.   -  person Ognyan    schedule 11.07.2015
comment
@DerGol...lum Другой вопрос касается довольно конкретной технической проблемы. Текущий больше касается получения исчерпывающего списка преимуществ/проблем, чтобы каждый мог сам решить, какой Даггер выбрать. Удалю вопрос, если получится спровоцировать бессмысленную дискуссию или флейм...   -  person Ognyan    schedule 11.07.2015
comment
Ну, я полностью согласен с тем, что прокомментировал @Selvin. Но это может быть редактирование вашего предыдущего сообщения, которое сделает его богаче и устранит дублирование.   -  person Phantômaxx    schedule 11.07.2015
comment
youtu.be/oK_XtfXPkqw?t=33m14s   -  person subhash    schedule 26.09.2015


Ответы (2)


Некоторые преимущества и недостатки взяты из https://blog.gouline.net/2015/05/04/dagger-2-even-sharper-less-square/ и http://google.github.io/dagger/dagger-1-migration.html:

Преимущества Кинжала 2:

  • Больше никаких размышлений — все делается как конкретные вызовы (ProGuard работает вообще без настройки)
  • Нет больше компоновки графа во время выполнения — повышается производительность, в том числе для отдельных запросов.
  • Отслеживаемость — улучшенный сгенерированный код и отсутствие рефлексии помогают сделать код читабельным и простым для понимания.
  • Поддерживает внедрение методов в дополнение к внедрению полей и конструкторов, которые были единственными двумя типами, поддерживаемыми Dagger 1.
  • Модули требуют меньше настроек, чем Dagger 1
  • Позволяет пользователям использовать любую корректную аннотацию области действия. Dagger 1 поддерживал только один прицел: @Singleton.

И недостатки:

  • Метод inject() теперь имеет сильную ассоциацию типа с целью внедрения. Это хорошо для отладки, но усложняет обычную практику внедрения из базовых классов (например, базовых действий, фрагментов и т. д.).
  • Реализация компонента требует перестроения проекта, чтобы он появился, и любые ошибки компиляции, связанные с внедрением, приводят к исчезновению класса (т.е. не созданию).
  • Не поддерживает overrides. Модули, которые переопределяют простые подделки тестирования, могут создать подкласс модуля для эмуляции этого поведения. Модули, которые используют переопределения и полагаются на внедрение зависимостей, должны быть декомпозированы, чтобы вместо этого переопределяемые модули представлялись как выбор между двумя модулями.

EDIT 2016/11/16: Это не техническое преимущество, но Dagger 1 устарел (по состоянию на 15 сентября 2016 г.) и больше не будет активно развиваться. Они рекомендуют перейти на Dagger 2.

person snafu109    schedule 29.01.2016
comment
Я больше не могу найти источник информации, но D2 должен быть на 17% быстрее, чем D1.. - person Snicolas; 14.07.2016

Я бы не рекомендовал смотреть на toothpick.

Как соавтор, я, очевидно, слишком предвзят, но да, это гораздо проще в использовании, по крайней мере, в большинстве случаев так же быстро, как кинжалы. И на самом деле дерево областей действия — это очень мощный способ разработки более продвинутых функций, таких как повторное использование экземпляров в областях, охватывающих несколько действий.

person Snicolas    schedule 14.07.2016
comment
Вы не хотели бы? Что ж, я бы порекомендовал Toothpick — я использовал Dagger 2 намного больше, но эта библиотека пока не доставила мне никаких проблем. - person npace; 11.04.2017