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

Что такое SingletonComponent в Hilt?

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

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

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

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

SingletonComponent в Hilt: Контейнер для уникальных зависимостей

SingletonComponent в Hilt — это один из ключевых предопределенных компонентов (Predefined Components), который является контейнером или областью (scope) для предоставления зависимостей (Dependency Injection) с жизненным циклом, соответствующим всему приложению (Application-level). Его основная цель — обеспечить, что определенные объекты создаются единожды (singleton) на протяжении всей жизни приложения и предоставляются всем частям программы, которые нуждаются в них.

Основная роль и жизненный цикл

Этот компонент напрямую связан с классом Application. Когда Hilt создает граф зависимостей, SingletonComponent «живет» столько же, сколько и объект вашего Application. Это делает его идеальным выбором для объектов, которые должны быть уникальными и общими для всего приложения, таких как:

  • Базы данных (Room Database, Retrofit клиенты)
  • Репозитории (Repository), которые управляют данными для всего приложения
  • Общие менеджеры (Shared Preferences, Analytics Tracker)
  • Клиенты сетевых сервисов (API Clients)

Как использовать SingletonComponent с аннотациями

Вы связываете зависимость с SingletonComponent с помощью аннотации @Singleton. Когда вы аннотируете модуль (@Module) или метод предоставления (@Provides) внутри этого модуля с @Singleton, Hilt понимает, что созданный объект должен быть помещен в контейнер SingletonComponent и будет существовать как единственный экземпляр.

Пример практического использования:

Рассмотрим типичный случай: предоставление экземпляра Room Database. Мы хотим, чтобы база данных создавалась один раз и использовалась всеми активностями, фрагментами и репозиториями.

// 1. Определяем Module, который будет "привязан" к SingletonComponent.
@Module
@InstallIn(SingletonComponent::class) // Устанавливаем модуль именно в этот компонент
object DatabaseModule {

    // 2. Метод, предоставляющий экземпляр базы данных. Аннотация @Singleton гарантирует единственный экземпляр.
    @Provides
    @Singleton
    fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase {
        return Room.databaseBuilder(
            context,
            AppDatabase::class.java,
            "my_app_database"
        ).build()
    }

    // 3. Также можно предоставить DAO. Он будет извлечен из единственного экземпляра DB.
    @Provides
    fun provideUserDao(appDatabase: AppDatabase): UserDao {
        return appDatabase.userDao()
    }
}

Взаимосвязь с другими компонентами Hilt

SingletonComponent является родительским компонентом для всех других предопределенных компонентов Hilt, таких как ActivityComponent, FragmentComponent, ViewModelComponent и ServiceComponent. Это означает, что любая зависимость, доступная в SingletonComponent, автоматически доступна (может быть внедрена) во всех его дочерних компонентах. Это фундаментальный принцип иерархии компонентов в Hilt.

Пример иерархии и внедрения:

// Репозиторий, предоставленный как @Singleton, доступен во всем приложении.
@Singleton
class UserRepository @Inject constructor(
    private val userDao: UserDao // DAO внедряется из того же SingletonComponent
) {
    // ... методы репозитория
}

// В Activity (дочерний компонент) мы можем напрямую внедрить этот репозиторий.
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    // ActivityComponent имеет доступ к зависимостям родительского SingletonComponent.
    @Inject
    lateinit var userRepository: UserRepository

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Используем общий репозиторий...
        userRepository.getUsers()
    }
}

Важные технические детали и ограничения

  • Создание экземпляра: Объект с аннотацией @Singleton создается при первом запросе (first request) в графе зависимостей, а не при запуске приложения.
  • Thread Safety: Hilt гарантирует, что предоставление @Singleton зависимостей в рамках SingletonComponent является потокобезопасным по умолчанию. Однако, вы должны самостоятельно обеспечивать внутреннюю потокобезопасность вашего класса, если его состояние может изменяться из разных потоков.
  • Не для всего: Не следует помещать в @Singleton объекты, которые зависят от контекста с более коротким жизненным циклом (например, Activity), или данные, специфичные для пользователя, которые должны очищаться между сессиями.

Ключевые выводы

SingletonComponent — это фундаментальный и родительский компонент в иерархии Hilt, предназначенный для управления зависимостями уровня приложения. Использование аннотации @Singleton вместе с @InstallIn(SingletonComponent::class) позволяет эффективно управлять ресурсами, избегать многократного создания тяжелых объектов и обеспечивать единый доступ к общим сервисам во всем Android приложении, соблюдая принципы чистой архитектуры и эффективного управления памятью.