예제 링크 : https://github.com/seyoungcho2/KoinExample
예제 브랜치명 : example/example5 *브랜치 필수 확인
의존성 제공 메서드 single과 factory
single은 한 번만 객체를 생성하고 factory는 호출 될때마다 객체를 생성한다.
다음과 같은 Student("student-kim")은 single로 제공되고 Student("student-cho")는 factory로 제공되는 상황을 가정해보자.
module {
single(named("kim")) { Student("student-kim") }
factory(named("cho")) { Student("student-cho") }
}
이때 다음과 같이 각각에 대한 의존성을 두 번씩 주입했다고 해보자
val studentKim1 : Student by inject(named("kim"))
val studentKim2 : Student by inject(named("kim"))
val studentCho1 : Student by inject(named("cho"))
val studentCho2 : Student by inject(named("cho"))
그러면 <그림1>과 같이 주입이 일어난다.
single로 제공되는 kim은 한번만 생성되어 주입되지만 factory로 제공되는 cho는 호출될 때마다 생성되어 주입 된다.
따라서 Kotlin 동등성 비교 연산자(두 객체가 동일한지 여부를 확인)를 이용하여 확인하면
studentKim1 === studentKim2 // true
studentCho1 === studentCho2 // false
kim은 true가 나오며 cho는 false 가 나오게 된다.
전체 코드 정리
전체 코드는 다음과 같다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
startKoin {
androidContext(this@MainActivity)
modules(
module {
single(named("kim")) { Student("student-kim") }
factory(named("cho")) { Student("student-cho") }
}
)
}
val studentKim1 : Student by inject(named("kim"))
val studentKim2 : Student by inject(named("kim"))
val studentCho1 : Student by inject(named("cho"))
val studentCho2 : Student by inject(named("cho"))
findViewById<TextView>(R.id.textViewTeacher).text = (studentKim1 === studentKim2).toString() // true
findViewById<TextView>(R.id.textViewStudent).text = (studentCho1 === studentCho2).toString() // false
}
}
이 코드를 실행할 경우 다음과 같은 결과 화면이 나온다.
반응형