Какие основные компоненты есть в Dagger и как они работают
Что проверяют
Понимаете ли вы, как Dagger строит граф зависимостей и почему делает это при компиляции, а не в рантайме. Следом спрашивают, как на самом деле работает @Singleton и чем Dagger отличается от Hilt.
Как отвечать
Разберите роли:
@Inject: на конструкторе говорит Dagger, как создать класс. На поле используется для классов, которые создаёт система, например Activity, и заполняется вызовомinject();@Moduleс@Provides: рецепты для типов, чей конструктор вы не контролируете: Retrofit, OkHttp, Room;@Binds: абстрактный метод в модуле, связывает интерфейс с реализацией. Дешевле@Provides, потому что не требует тела метода и лишнего фабричного кода;@Component: интерфейс, по которому Dagger генерирует классDaggerAppComponent. Содержит методы получения объектов и методыinject(), внешние объекты вродеContextпопадают в граф через@Component.Factoryи@BindsInstance;- скоупы:
@Singletonили свой@ActivityScopeозначают один экземпляр на экземпляр компонента. Без скоупа объект создаётся заново при каждом запросе; - сабкомпоненты:
@Subcomponentнаследует граф родителя и живёт короче, так строят иерархию приложение, экран, фича; - квалификаторы:
@Namedили свой@Qualifierразличают две привязки одного типа.
Главное про механику: граф проверяется при сборке, и отсутствующая привязка даёт ошибку компиляции, а не падение у пользователя. Сгенерированный код обходится без рефлексии, обработчик подключается через kapt или KSP.
Закончите Hilt: это надстройка над Dagger с готовыми компонентами вроде SingletonComponent и ViewModelComponent и аннотациями @AndroidEntryPoint, @HiltViewModel, которые убирают ручную сборку графа.
Где спотыкаются
Считают @Singleton глобальным синглтоном. Это обычный скоуп: создадите компонент дважды и получите два «синглтона».
Верят, что скоупы защищают от утечек. Бывает наоборот: Activity или её контекст, попавший в объект со скоупом @Singleton, будет жить всё время работы приложения.
Путают @Provides и @Binds или думают, что Dagger ищет зависимости рефлексией в рантайме, как старые DI-контейнеры. Здесь ждут слов про кодогенерацию.