DI/Dagger2
Android Code Lab(Dagger2) 정리3
hik14
2021. 12. 21. 16:08
여러 가지 이유로 Component에서 동일한 종속성 인스턴스를 제공받을 필요가 있다.
1. 서로 다른 type들이 종속성을 주입받아 생성되어 제공될때 동일한 종속성을 주입받아야 하는 경우.
2. 객체를 만드는 cost이 많이 들고 종속성으로 선언될 때마다 새 인스턴스를 만들고 싶지 않은 경우.
scope를 사용하면 동일한 객체를 Component로 부터 주입받을 수 있습니다.
scope는 Component내의 제공받는 객체의 생명주기를 뜻합니다.
scope를 Component가 주입하는 type에 지정한다는 것은 해당 type을 제공해야 할 때마다 동일한 인스턴스가 사용된다는 것을 의미합니다
AppComponent의 경우 javax.inject 패키지와 함께 제공되는 only scope annotation인 @Singleton 주석을 사용할 수 있습니다.
@Singleton으로 Component에 주석을 추가하면, @Singleton으로 주석이 달린 모든 class 의 범위가 해당 수명으로 지정됩니다.
AppComponent.kt
@Singleton
@Component(modules = [StorageModule::class])
interface AppComponent { ... }
이제 @Singleton으로 주석이 달린 클래스는 AppComponent로 Scope가 지정됩니다
@Singleton
class UserManager @Inject constructor(private val storage: Storage) {
...
}
동일한 UserManager 인스턴스가 RegistrationActivity 및 MainActivity에 제공됩니다.

UserManager도 흰색 점으로 표시됩니다. Context와 마찬가지로 AppComponent의 동일한 인스턴스에서 종속성으로 필요할 때 UserManager의 동일한 인스턴스가 제공됩니다.