안드로이드 의존성 주입 라이브러리로 Dagger라이브러리를 사용하는데 너무 복잡하고 어려워 구글에서 발표한 라이브러리입니다.
Application 내부에 생명주기랑 연동되는 component 보관함을 만들고 그 안에 의존 객체를 생성합니다. 액티비티나 프래그먼트에서 의존성 주입이 필요할 때 컴포넌트를 통해서 의존 객체를 주입합니다.
Hilt가 제공하는 의존객체는 기본적으로 UnScoped상태입니다. 요청할 때마다 새로운 객체가 만들어집니다.
이를 방지하기 위해서 각 의존객체에는 Scope라는 이름의 생명주기를 지정할 수 있는데 이 스코프의 범위를 나타내는 것이 @ScopeAnnotation입니다.
@Singleton을 붙이면 앱 전체에서 하나만 만들어지게 됩니다.
class AnalyticsAdapter @Inject constructor(){}
@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {
@Inject lateinit var analytics : AnalyticsAdapter
}
class AnalyticsAdapter @Inject constructor(){}
@AndroidEntryPoint
class ExampleActivity @Inject constructor(
var analytics : AnalyticsAdapter
) : AppCompatActivity() {}
의존 객체를 담는 클래스를 Hilt에서는 Module이라는 이름으로 정의합니다. 컴포넌트 안에 모듈을 만들고 모듈 내부에 의존객체를 생성해 주입할 수 있습니다.
모듈을 정의할 때는 @Module과 @InstallIn을 사용합니다
외부 라이브러리로 부터 만들어진 인스턴스와 인터페이스인스턴스는 필드가 생성할 수 없기 때문에 @Provides와 @Bind를 사용합니다
//모듈을 정의합니다.
@Module
//InstallIn을 통해서 Activity가 Scope로 설정됩니다.
@InstallIn(ActivityComponent::class)
object AnalyticsModule{
@Provides
fun provideAnalyticsService(
//Potential dependencies of this type
) : AnalyticsService{
return Retrofit.Builder()
.baseUrl("http:~~//")
.build()
.create(AnalyticsService::class.java)
}
}
interface AnalyticsService{
fun analyticsMethods()
}
class AnalyticsServiceImple @Inject constructor() : AnalyticsService{}
@Module
@InstallIn(ActivityComponent::class)
abstract class AnalyticsModule{
@Binds
abstract fun bindAnalyticsService(
analyticsServiceImple : AnalyticsServiceImpl
) : AnalyticsService
}