hilt의 컴포넌트는 여러 모듈을 설치 하는 방식으로 의존성 세팅을 한다.
컴파일 타임, 애노테이션 처리 → @module 탐색 → @InstallIn에서 설치될 컴포넌트 탐색 → 해당 컴포넌트 설치
@Module // 모듈 선언
@InstallIn(SingletonComponent::class) // 어디 위치 컴포넌트에 모듈 설치 할 것인지 정의
object fooModule {
@Provide
fun provideFoo: Foo{..}
// 매번 새로운 인스턴스를 생성
@Singleton // bar 인스턴스를 singleton 생명주기에 맞게 처리
@Provide
fun provideBar: Bar{..}
// singleton 주기에 맞게 인스턴스를 한번만 생성
}
어디 컴포넌트에 위치할것인지 선택하고 바인딩
Module을 선언하면 반드시 InstallIn을 선언 해야 한다. (테스트 코드 제외)
@Module
@InstallIn(SingletonComponent::class)
object fooModule {
@Provide
fun provideFoo(app: Application): Bar {..}
}
@Module
@InstallIn(ActivityComponent::class)
object ActivityModule {
@Provides
fun provideActivityHelper(
activity: Activity
): ActivityHelper {
return ActivityHelper( activity)
}
}
해당에 위치한 컴포넌트에 따라서 해당 컴포넌트에 위치한 해당 생명주기와 관련된 특정 파라미터(예: Activity, Fragment)를 제공합니다.
@Module
@InstallIn(ActivityComponent::class)
object ActivityModule {
@Provides
@ActivityScoped
fun provideAnalytics(): Analytics {
return Analytics()
}
@Provides
@ActivityScoped
fun provideRepository(analytics: Analytics): Repository {
return Repository(analytics)
}
}
여러 컴포넌트에 모듈을 설치할 때, @Provides
함수의 스코프는 다음 원칙을 따라야 합니다