В чем разница между аннотациями Component и Subcomponent в Dagger

«В чем разница между аннотациями Component и Subcomponent в Dagger» — вопрос из категории DI, который задают на 24% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

@Component - это корневой компонент, который создает граф зависимостей. Он должен быть объявлен в корне приложения и может иметь зависимости от других компонентов через dependencies.

@Subcomponent - это дочерний компонент, который наследует граф зависимостей родительского компонента. Он объявляется внутри интерфейса родительского компонента и создается через фабричный метод родителя.

Ключевые различия:

  1. Subcomponent имеет доступ ко всем зависимостям родителя
  2. Subcomponent не требует явного указания зависимостей через dependencies
  3. Subcomponent объявляется внутри родительского компонента

Пример:

@Component
interface AppComponent {
    fun loginComponent(): LoginComponent.Factory
}

@Subcomponent
interface LoginComponent {
    @Subcomponent.Factory
    interface Factory {
        fun create(): LoginComponent
    }
}