08. Lazy 주입과 Provider 주입
- 상황에 따른 의존성 주입 시점 늦추기 또는 새로운 객체 요청
Lazy<T>
Provider<T>
Lazy 주입
- 객체가 초기화되는 데 시간이 필요한 경우
- 바인드된 타입 T를 제네릭으로 갖는
Lazy<T>
를 만듦. get() 이불리기 전 까지는 초기화 되는것을 늦출 수 있음
import dagger.Component
import dagger.Lazy
import dagger.Module
import dagger.Provides
import javax.inject.Inject
- Lazy 를 dagger 말고 다른 Lazy 를 써서 삽질 좀 했네요. import 주의 합시다
cannot be provided without an @Provides-annotated method.
오류 해결
@Module
class CounterModule {
var next = 100
@Provides
fun provideInteger(): Int {
println("computing...")
return next++
}
}
@Component(modules = [CounterModule::class])
interface CounterComponent {
fun inject(counter: Counter)
}
class Counter {
@Inject
lateinit var lazy: Lazy<Int>
fun printLazy() {
println("printing...")
println(lazy.get())
println(lazy.get())
println(lazy.get())
}
}
- Test
@Test
fun test_lazy(){
val componentA = DaggerCounterComponent.create()
val counter = Counter()
componentA.inject(counter)
counter.printLazy()
val componentB = DaggerCounterComponent.create()
componentB.inject(counter)
counter.printLazy()
componentA.inject(counter)
counter.printLazy()
}
- result
printing...
computing...
100
100
100
printing...
computing...
100
100
100
printing...
computing...
101
101
101
Provider 주입
- 매번 새로운 인스턴스를 주입받고 싶을 때
- 바인드된 타입 T를 제네릭으로 갖는
Provider<T>
, get() 메서드 호출 시 마다 새로운 개체 제공
import javax.inject.Provider
class Counter {
// @Inject
// lateinit var lazy: Lazy<Int>
@Inject
lateinit var provider:Provider<Int> // Provider 사용
fun printLazy() {
println("printing...")
println(provider.get())
println(provider.get())
println(provider.get())
}
}
@Test
fun test_provider(){
val component = DaggerCounterComponent.create()
val counter = Counter()
component.inject(counter)
counter.printLazy()
}
printing...
computing...
100
computing...
101
computing...
102
- Provider.get() 호출 시 새로운 객체를 생성
- 컴포넌트가 @Singleton 과 같은 특정 범위로 지정되어 있다면, Provider 를 사용 한다고 해도 바인드된 의존성은 싱글턴으로 관리되어 같은 인스턴스를 제공 받는다.
2021.07.22 - [Android/클린 아키텍처] - [Clean Architecture] 08-Dagger2의 컴포넌트(Component)
2021.07.21 - [Android/클린 아키텍처] - [Clean Architecture] 07-Dagger2의 모듈(Module)
2021.07.20 - [Android/클린 아키텍처] - [Clean Architecture] 06-Dagger2 란? (+ Adnroid 적용 샘플)
해당 글은 '아키텍처를 알아야 앱 개발이 보인다' 를 공부하며 요약 정리한 글 입니다.
'Android > 클린 아키텍처' 카테고리의 다른 글
[Clean Architecture] 11-범위 지정하기 (@Scope) (0) | 2021.07.25 |
---|---|
[Clean Architecture] 10-한정자 (@named) (0) | 2021.07.24 |
[Clean Architecture] 08-Dagger2의 컴포넌트(Component) (0) | 2021.07.22 |
[Clean Architecture] 07-Dagger2의 모듈(Module) (0) | 2021.07.21 |
[Clean Architecture] 06-Dagger2 란? (+ Adnroid 적용 샘플) (0) | 2021.07.20 |