Как Hof зависимость, отмеченная аннотацией Singleton, сохраняется в рамках внедрения зависимостей Dagger?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Аннотация @Singleton в Dagger не делает объект глобальным сама по себе, а задаёт область жизни зависимости внутри конкретного графа зависимостей. Если один и тот же Component живёт долго, Dagger будет возвращать один и тот же экземпляр для этой зависимости. При создании нового Component кэш сбрасывается, и экземпляр создаётся заново.
Определение:
@Singleton в Dagger — это scope-аннотация, которая говорит, что в пределах одного Component зависимость должна создаваться один раз и переиспользоваться при последующих запросах. Dagger сохраняет такой объект в internal cache компонента и возвращает его повторно, пока жив сам компонент. Важно: @Singleton работает только если и провайдер, и Component согласованы по scope.
Пример использования:
@Singleton
@Component(modules = [NetworkModule::class])
interface AppComponent {
fun apiClient(): ApiClient
}
@Module
class NetworkModule {
@Provides
@Singleton
fun provideApiClient(): ApiClient {
return ApiClient()
}
}
class ApiClient
Если несколько раз вызвать appComponent.apiClient(), будет возвращён один и тот же экземпляр ApiClient.
Пояснение кода:
@SingletonнаprovideApiClient()помечает зависимость как scoped.@SingletonнаAppComponentзадаёт область, в которой этот scope действует.- При первом запросе
ApiClientDagger создаёт объект и сохраняет его внутриAppComponent. - При следующих запросах тот же
AppComponentотдаёт уже сохранённый экземпляр. - Если создать новый
AppComponent, будет создан новыйApiClient, потому что кэш привязан к компоненту, а не к процессу приложения.
Ключевые моменты:
@Singletonв Dagger — это не “один на всё приложение”, а “один на область компонента”.- Экземпляр хранится в кэше внутри
Component. - Повторный запрос из того же
Componentвернёт тот же объект. - Новый
Componentозначает новый кэш и новый экземпляр. - Scope аннотация должна быть согласована между зависимостью и компонентом.
- Для Android обычно
@Singletonсвязывают сAppComponent, а не сActivityилиFragment-компонентами.