← Назад к вопросам

Какую аннотацию в Dagger можно использовать для добавления зависимости в компонент извне?

2.0 Middle🔥 151 комментариев
#Dependency Injection

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

@BindsInstance в Dagger

Для добавления зависимости в компонент извне в Dagger используется аннотация @BindsInstance. Это ключевая аннотация, позволяющая "связать" внешний объект (часто создаваемый во время выполнения, например, контекст приложения) с графом зависимостей Dagger, сделав его доступным для внедрения в других частях приложения.

Основное назначение и использование

@BindsInstance применяется в методе билдера компонента (@Component.Builder) или в билдере фабрики (@Component.Factory). Она связывает параметр метода с типом, который будет доступен в графе зависимостей. Типичный пример — передача Context или Application в компонент при инициализации Dagger.

Пример с @Component.Builder:

@Component(modules = [AppModule::class])
interface AppComponent {
    fun inject(activity: MainActivity)

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: Application): Builder
        
        fun build(): AppComponent
    }
}

Инициализация компонента:

class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        appComponent = DaggerAppComponent.builder()
            .application(this) // Передаем экземпляр Application
            .build()
    }
}

Пример с @Component.Factory (современный подход):

@Component(modules = [AppModule::class])
interface AppComponent {
    fun inject(activity: MainActivity)

    @Component.Factory
    interface Factory {
        fun create(@BindsInstance application: Application): AppComponent
    }
}

Инициализация:

appComponent = DaggerAppComponent.factory().create(this)

Ключевые особенности @BindsInstance:

  • Связывание внешних зависимостей: Позволяет включать объекты, созданные вне Dagger (например, в рантайме), в граф зависимостей.
  • Типобезопасность: Dagger обеспечивает проверку типов при компиляции, исключая ошибки несовместимости.
  • Избавление от модулей: Заменяет необходимость создания отдельного модуля с @Provides для таких объектов, упрощая код.
  • Связывание с квалификаторами: Может использоваться с пользовательскими квалификаторами (например, @ApplicationContext):
    @BindsInstance
    fun appContext(@ApplicationContext context: Context): Builder
    

Отличие от @Provides в модулях

В отличие от @Provides, который определяет, как создавать зависимость внутри модуля, @BindsInstance сообщает Dagger: "используй этот уже готовый объект". Это особенно полезно для:

  • Объектов, создаваемых системой (Application, Context).
  • Конфигурационных данных (например, API-ключей, переданных извне).
  • Объектов с жизненным циклом, управляемым фреймворком (Activity в Android).

Важные нюансы:

  • Область видимости: Объект, переданный через @BindsInstance, наследует область видимости компонента. Например, если компонент @Singleton, то Application будет синглтоном в графе.
  • Несколько экземпляров: Можно передать несколько зависимостей через разные методы с @BindsInstance.
  • Иммутабельность: После передачи в компонент объект становится неизменяемой частью графа зависимостей.

Таким образом, @BindsInstance — это мощный инструмент в Dagger для интеграции внешних зависимостей, обеспечивающий гибкость и чистоту кода при построении графа зависимостей в Android-приложениях.

Какую аннотацию в Dagger можно использовать для добавления зависимости в компонент извне? | PrepBro