티스토리 뷰

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 적용 샘플)

 

해당 글은 '아키텍처를 알아야 앱 개발이 보인다' 를 공부하며 요약 정리한 글 입니다.
댓글
최근에 올라온 글
최근에 달린 댓글
네이버 이웃추가
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함