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

Ответ

@Module + @Provides или @Binds для предоставления зависимостей.
Для внедрения извне используй @Component.Builder или @Component.Factory:

@Component(modules = [MyModule::class])
interface MyComponent {
    @Component.Factory
    interface Factory {
        fun create(@BindsInstance externalDep: ExternalDependency): MyComponent
    }
}

// Использование:
val component = DaggerMyComponent.factory()
    .create(ExternalDependencyImpl())

Ответ 18+ 🔞

А, ну это же классика, ёпта! Смотри, бывает такая ситуация, что твоя зависимость — как хуй с горы, её снаружи приносят, и Dagger про неё нихуя не знает. Например, какой-нибудь конфиг рантайма или клиент API, который ты собрал своими кривыми ручками.

Так вот, чтобы эту внешнюю хрень запихнуть в твой граф, нужно использовать @Component.Builder или @Component.Factory. Это как будто ты говоришь Dagger: «Слушай, дружок, вот эту штуку я тебе сам дам, а ты уж там внутри разберись, куда её пихать».

Смотри, как это выглядит. Берёшь свой компонент и делаешь ему фабрику:

@Component(modules = [MyModule::class])
interface MyComponent {
    // Внимание на хуй! Вот эта самая фабрика
    @Component.Factory
    interface Factory {
        // Помечаешь параметр @BindsInstance — это и есть наш внешний инжект
        fun create(@BindsInstance externalDep: ExternalDependency): MyComponent
    }
}

А потом используешь это дело, ядрёна вошь, просто и элегантно:

// Создаёшь свою внешнюю зависимость, хоть на коленке собранную
val myExternalThing = ExternalDependencyImpl()

// И говоришь Даггеру: на, мудила, собери мне всё, но с этой штукой внутри
val component = DaggerMyComponent.factory()
    .create(myExternalThing)

И всё! Dagger возьмёт этот externalDep, засунет его в граф и будет инжектить куда попросят, будто он там всегда и был. Главное — не перепутай, это для внедрения извне, а не для тех зависимостей, которые ты можешь наколдовать внутри модуля с помощью @Provides. Если можешь создать объект внутри модуля — так и делай, не выёбывайся. А этот способ — именно для тех случаев, когда терпения ноль ебать и объект должен быть передан извне, иначе вся архитектура накрывается медным тазом.

Короче, @BindsInstance — это твой волшебный пинок под зад, чтобы протолкнуть в граф что угодно.