Какие нотации используются в Dagger
Что проверяют
Собирали ли вы граф зависимостей сами или только правили чужие модули. Названия аннотаций это входной билет, дальше смотрят, понимаете ли вы, что Dagger генерирует код на этапе компиляции и там же проверяет граф. Следом спросят про разницу @Binds и @Provides либо про то, что на самом деле даёт скоуп.
Как отвечать
Базовый набор Dagger 2:
@Inject: на конструкторе объясняет, как создать объект, на поле помечает, что значение придёт извне, и требует явной инъекции;@Moduleи@Provides: метод возвращает готовый экземпляр, нужен для чужих классов и для интерфейсов со сложной сборкой;@Binds: абстрактный метод с одним параметром, привязка реализации к интерфейсу без тела, генерирует меньше кода;@Componentи@Subcomponent: интерфейс, связывающий модули с точками инъекции, рядом@Component.Factoryи@BindsInstanceдля передачи готовых объектов внутрь графа;@Scope,@Singleton, свои аннотации вроде@ActivityScope: один экземпляр на время жизни компонента, а не на всё приложение.@Reusableкэширует без гарантии единственности;@Qualifierи@Named: различают две привязки одного типа, например дваOkHttpClient;- мультибиндинг:
@IntoSet,@IntoMap,@ClassKey, классика для фабрикиViewModel; @AssistedInject,@Assisted,@AssistedFactory: когда часть аргументов известна только в рантайме, напримерuserId.
Добавьте контекст: в Android поверх Dagger почти всегда стоит Hilt со своим набором (@HiltAndroidApp, @AndroidEntryPoint, @HiltViewModel, @InstallIn, @EntryPoint, квалификатор @ApplicationContext), а генерация в Kotlin-проектах переехала с kapt на KSP ради скорости сборки.
Где спотыкаются
Вешают @Singleton на всё подряд и ловят утечку: объект со ссылкой на контекст экрана живёт столько же, сколько приложение.
Пишут @Provides там, где нужен @Binds, и не понимают ошибку сборки. @Binds требует абстрактного метода в абстрактном модуле или интерфейсе.
Считают, что Dagger работает через рефлексию в рантайме. Он генерирует классы при компиляции, поэтому «cannot be provided» это ошибка сборки, а не падение приложения у пользователя.