Ответ 1
Некоторые преимущества и недостатки, взятые из https://blog.gouline.net/2015/05/04/dagger-2-even-sharper-less-square/ и http://google.github.io/dagger/dagger-1-migration.html:
Преимущества кинжала 2:
- Больше не отражается - все делается как конкретные вызовы (ProGuard работает без конфигурации вообще)
- Отсутствует больше графика графика выполнения - повышает производительность, включая случаи для каждого запроса.
- Прослеживаемый - лучший сгенерированный код и отсутствие отражения помогают сделать код читаемым и легко следовать
- Поддерживает инъекцию метода в дополнение к инъекции поля и конструктора, которые были единственными двумя типами, поддерживаемыми кинжалом 1
- Модули требуют меньше конфигурации, чем Dagger 1
- Позволяет пользователям использовать любую хорошо сформированную аннотацию области. Кинжал 1 поддерживает только одну область:
@Singleton
.
И недостатки:
- Теперь метод
inject()
имеет сильную ассоциацию типов с целью инъекции. Это хорошо для отладки, но это усложняет обычную практику инъекции из базовых классов (например, базовые действия, фрагменты и т.д.). - Для реализации компонента требуется перестроение проекта, и любые ошибки компиляции, связанные с инъекциями, приводят к исчезновению класса (т.е. не генерируемого).
- Не поддерживает
overrides
. Модули, которые переопределяют для простых подделок при тестировании, могут создать подкласс модуля для эмуляции этого поведения. Модули, которые используют переопределения и полагаются на инъекцию зависимостей, должны быть разложены так, чтобы вместо этого модули переопределялись как выбор между двумя модулями.
EDIT 2016/11/16: Это не техническое преимущество, но Кинжал 1 теперь не рекомендуется (по состоянию на 15 сентября 2016 года) и больше не будет активно развиваться. Они рекомендуют перейти на кинжал 2.