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

Как инициализируется Dagger

2.0 Middle🔥 141 комментариев
#Dependency Injection#Архитектура и паттерны

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

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

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

Инициализация Dagger в Android-приложении

Инициализация Dagger в Android-приложении — это многоэтапный процесс, который начинается с настройки компонентов и заканчивается их внедрением в жизненный цикл приложения. Современный подход использует Dagger Hilt (упрощённую обёртку над Dagger), но понимание базовой инициализации также важно.

Основные этапы инициализации

  1. Определение корневого компонента (обычно ApplicationComponent).
  2. Создание фабрики компонента через Dagger.
  3. Инициализация в классе Application.
  4. Внедрение зависимостей в активности, фрагменты или другие классы.

Классический Dagger (без Hilt)

1. Создание корневого компонента

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

@Component(modules = [NetworkModule::class, StorageModule::class])
interface ApplicationComponent {
    // Фабрика для внедрения в Activity
    fun inject(activity: MainActivity)
    
    // Провайдер для зависимостей, которые нужны в других компонентах
    fun repository(): DataRepository
    
    // Для внедрения в другие классы можно использовать Builder
    @Component.Builder
    interface Builder {
        fun build(): ApplicationComponent
        @BindsInstance
        fun application(application: Application): Builder
    }
}

2. Построение графа зависимостей в Application

Компилятор Dagger генерирует класс DaggerApplicationComponent, который реализует наш интерфейс.

class MyApplication : Application() {
    lateinit var appComponent: ApplicationComponent
    
    override fun onCreate() {
        super.onCreate()
        appComponent = DaggerApplicationComponent.builder()
            .application(this) // Связываем экземпляр Application
            .build()
    }
}

3. Внедрение в Activity

Зависимости внедряются путем вызова метода inject().

class MainActivity : AppCompatActivity() {
    @Inject lateinit var viewModel: MainViewModel
    
    override fun onCreate(savedInstanceState: Bundle?) {
        (application as MyApplication).appComponent.inject(this)
        super.onCreate(savedInstanceState)
        // viewModel теперь готова к использованию
    }
}

Современный подход: Dagger Hilt

Hilt автоматизирует большую часть этой настройки, предоставляя предопределённые компоненты и скоупы.

1. Настройка Application

Аннотируем класс Application и настраиваем в AndroidManifest.xml.

@HiltAndroidApp
class MyApplication : Application()

2. Определение модулей

Модули указывают, как предоставлять зависимости.

@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
    @Provides
    @Singleton
    fun provideRetrofit(): Retrofit {
        return Retrofit.Builder()
            .baseUrl("https://api.example.com/")
            .build()
    }
}

3. Внедрение в Activity или Fragment

Используем аннотацию @AndroidEntryPoint.

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    @Inject lateinit var repository: DataRepository
    // Hilt автоматически внедряет зависимости
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // repository уже инициализирован
    }
}

Ключевые отличия в инициализации

АспектКлассический DaggerDagger Hilt
КомпонентыОпределяются вручнуюПредопределены (SingletonComponent, ActivityComponent и др.)
ApplicationРучное создание DaggerComponentАннотация @HiltAndroidApp
ВнедрениеЯвный вызов component.inject(this)Аннотация @AndroidEntryPoint
СкоупыПользовательские аннотацииГотовые (@Singleton, @ActivityScoped)
СложностьВысокая, много шаблонного кодаНизкая, автоматизация

Основные правила инициализации

  • Инициализация должна происходить как можно раньше — обычно в onCreate() класса Application.
  • Компоненты создаются сверху вниз: Application → Activity → Fragment.
  • В классическом Dagger важно следить за областью видимости (scope), чтобы зависимости не создавались повторно.
  • В Hilt встроена поддержка ViewModel через @HiltViewModel и by viewModels().

Инициализация Dagger/Hilt — это создание графа зависимостей, который затем используется для внедрения во все части приложения. Hilt значительно упрощает этот процесс, уменьшая количество шаблонного кода и минимизируя возможность ошибок при настройке.

Как инициализируется Dagger | PrepBro