Как инициализируется Dagger
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Инициализация Dagger в Android-приложении
Инициализация Dagger в Android-приложении — это многоэтапный процесс, который начинается с настройки компонентов и заканчивается их внедрением в жизненный цикл приложения. Современный подход использует Dagger Hilt (упрощённую обёртку над Dagger), но понимание базовой инициализации также важно.
Основные этапы инициализации
- Определение корневого компонента (обычно
ApplicationComponent). - Создание фабрики компонента через Dagger.
- Инициализация в классе Application.
- Внедрение зависимостей в активности, фрагменты или другие классы.
Классический 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 уже инициализирован
}
}
Ключевые отличия в инициализации
| Аспект | Классический Dagger | Dagger 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 значительно упрощает этот процесс, уменьшая количество шаблонного кода и минимизируя возможность ошибок при настройке.