Hilt - @Inject 주석, @Module, @InstallIn, @Binds

2021. 1. 20. 19:40Android/DI(dependency injection)

@Inject 주석을 사용하여 필드 삽입을 실행합니다.

 

" 아래 analytics 변수는 initializer 하지 않았다. 일반적으로는 아래 로그는

Caused by: kotlin.UninitializedPropertyAccessException: lateinit property analytics has not been initialized

와 같은 에러를 호출하며 죽어야 정상이나

@Inject 주석을 사용하므로 인해 자동으로 initialized되어 죽지않고 "test" 라는 로그를 출력해준다. "

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    @Inject lateinit var analytics: AnalyticsAdapter
 
 	override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    	...
        Log.i("MainActivity","analytics.hello = ${analytics.hello}")
    }
}

class AnalyticsAdapter @Inject constructor(
    private val service: AnalyticsService
) {
    var hello: String = "test"

}

 

@Module, @InstallIn

Hilt 모듈은 @Module로 주석이 지정된 클래스입니다. Dagger 모듈과 마찬가지로 이 모듈은 특정 유형의 인스턴스를 제공하는 방법을 Hilt에 알려줍니다. 그러나 Dagger 모듈과는 달리, Hilt 모듈에 @InstallIn 주석을 지정하여 각 모듈을 사용하거나 설치할 Android 클래스를 Hilt에 알려야 합니다.

 

@Binds로 주석이 지정된 추상 함수를 생성하여 Hilt에 결합 정보를 제공합니다.

https://developer.android.com/training/dependency-injection/hilt-android?hl=ko#inject-interfaces

 

 

추상 함수 bindAnalyticsService 와 생성자 service가 결갑 됨

@InstallIn(ActivityComponent::class) 이 주석은 AnalyticsModule의 모든 종속 항목을 앱의 모든 활동에서 사용할 수 있음을 의미합니다.

 

" @Inject으로 Activity외 파일에서는 자동 initialized 되지 않는다 "

class AnalyticsAdapter @Inject constructor(
  private val service: AnalyticsService
) { ... }
interface AnalyticsService {
  fun analyticsMethods()
}

// Constructor-injected, because Hilt needs to know how to
// provide instances of AnalyticsServiceImpl, too.
class AnalyticsServiceImpl @Inject constructor(
  ...
) : AnalyticsService { ... }

@Module
@InstallIn(ActivityComponent::class)
abstract class AnalyticsModule {

  @Binds
  abstract fun bindAnalyticsService(
    analyticsServiceImpl: AnalyticsServiceImpl
  ): AnalyticsService
}