hilt의 컴포넌트는 여러 모듈을 설치 하는 방식으로 의존성 세팅을 한다.

모듈이 설치 되는 과정

컴파일 타임, 애노테이션 처리 → @module 탐색 → @InstallIn에서 설치될 컴포넌트 탐색 → 해당 컴포넌트 설치

@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 함수의 스코프는 다음 원칙을 따라야 합니다