Android Dependency Injection with Hilt¶
Hilt (built on Dagger) as the recommended DI framework for Android. Parallels Spring's IoC container but with Android lifecycle awareness.
Key Facts¶
- Hilt is Google's recommended DI for Android - built on Dagger 2 with less boilerplate
@HiltAndroidAppon Application class enables Hilt@AndroidEntryPointon Activity/Fragment enables injection@HiltViewModelwith@Inject constructorfor ViewModel injection@Module+@InstallInfor providing third-party dependencies@Singleton,@ActivityScoped,@ViewModelScopedcontrol lifecycle- Parallels Spring's
@Component/@Service/@Beanpattern
Patterns¶
Application Setup¶
Activity/Fragment Injection¶
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var repository: UserRepository
}
ViewModel Injection¶
@HiltViewModel
class UserViewModel @Inject constructor(
private val repository: UserRepository
) : ViewModel() {
// No ViewModelFactory needed!
}
Module for Third-Party Dependencies¶
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides @Singleton
fun provideApiService(): ApiService {
return Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(ApiService::class.java)
}
@Provides @Singleton
fun provideUserRepository(api: ApiService, dao: UserDao): UserRepository {
return UserRepository(api, dao)
}
@Provides @Singleton
fun provideDatabase(@ApplicationContext context: Context): AppDatabase {
return Room.databaseBuilder(context, AppDatabase::class.java, "app_db").build()
}
@Provides
fun provideUserDao(db: AppDatabase): UserDao = db.userDao()
}
Spring IoC vs Hilt Comparison¶
| Spring | Hilt | Purpose |
|---|---|---|
@Component | @Inject constructor | Auto-discovered bean |
@Service | @Inject constructor | Business logic |
@Bean in @Configuration | @Provides in @Module | Explicit creation |
@Autowired | @Inject | Field/constructor injection |
@Scope("singleton") | @Singleton | Scope control |
@Qualifier | @Qualifier + @Named | Disambiguation |
Gotchas¶
@Inject lateinit varfields must NOT be private in Activities/Fragments@HiltViewModelrequires@Inject constructor- cannot use no-arg constructor- Hilt modules must specify
@InstallInwith appropriate component (SingletonComponent,ActivityComponent, etc.) - Missing
@AndroidEntryPointon Fragment's host Activity causes runtime crash
See Also¶
- [[spring-ioc-beans]] - Spring's equivalent IoC container
- [[android-architecture-mvvm]] - ViewModel injection patterns
- [[kotlin-coroutines]] - Coroutines in injected services