В чем разница Dagger 1 и Dagger 2
Что проверяют
Знаете ли вы, что вторая версия ушла от рефлексии к генерации кода, и понимаете ли, что это дало.
Как отвечать
Главное отличие: Dagger 1 строил часть графа во время выполнения с использованием рефлексии, Dagger 2 генерирует весь код внедрения на этапе компиляции.
Что из этого следует:
- ошибки видны при сборке: недостающая зависимость или цикл в графе это ошибка компиляции с понятным сообщением, а не падение при запуске экрана;
- быстрее на старте: рефлексии нет вовсе, сгенерированный код это обычные вызовы конструкторов;
- граф можно прочитать: сгенерированные классы лежат рядом и отлаживаются как обычный код;
- компоненты вместо ObjectGraph: связь модулей и точек внедрения описывается явно через
@Componentи@Subcomponent, а не собирается динамически; - исчезло
@Module(injects = ...): перечислять цели больше не нужно.
Полезно добавить актуальный контекст, потому что сам вопрос уже исторический: в Android сегодня используют Hilt, надстройку над Dagger 2, которая убирает ручное описание компонентов и даёт готовые области, привязанные к жизненному циклу (@Singleton, @ActivityRetainedScoped, @ViewModelScoped). Dagger 1 не поддерживается много лет, и встретить его можно только в очень старом коде.
Где спотыкаются
Не могут объяснить, чем плоха рефлексия, кроме «медленно».
Считают Hilt отдельной библиотекой, не связанной с Dagger.
Не знают, что ошибки графа во второй версии ловятся при компиляции, и называют это преимуществом рантайма.
Путают области видимости с временем жизни компонента.