На сайте с документации к Dagger 2 есть следующий пример кода и слова:
class CoffeeMaker {
@Inject Heater heater;
@Inject Pump pump;
...
}
If your class has @Inject-annotated fields but no @Inject-annotated constructor, Dagger will inject those fields if requested, but will not create new instances. Add a no-argument constructor with the @Inject annotation to indicate that Dagger may create instances as well.
Что это значит? Т.е., если конструктора с @Inject не будет, как Dagger будет инжектить эти поля "if requested, but will not create new instances"?
Т.е. насколько я понимаю, тут:
class CoffeeMaker @Inject (Heater heater) {
}
если объект Heater раньше не был создан - dagger создаст новый его объект (условно говоря, heater = Heater()
), если же его объект сейчас используется другим классом, то получим тут ссылку на этот же обьект, что использует другой класс (условно говоря, heater = heaterObj
).
А что будет тут?
class CoffeeMaker {
@Inject Heater heater;
}
В случае, если объект Heater раньше не был создан? И в случае, если такой его обьект сейчас используется другим классом?
В этом случае нужно явно инжектить. Пример инжекта полей в Fragment() на андроид:
class AlbumsFragment: Fragment() {
@Inject
lateinit var mAdapter: AlbumsListAdapter
@Inject
lateinit var factory: CustomViewModelFactory
lateinit var viewModel: AlbumViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(false)
(activity?.application as App).getComponent().inject(this)
viewModel = ViewModelProviders.of(this, factory).get(AlbumViewModel::class.java)
viewModel.setAdapter(mAdapter)
mAdapter.setActivity(activity as AppCompatActivity)
}
}
Интерфейс Component:
@Component(modules = [AppModule::class])
interface ApplicationComponent {
fun inject(fragment: AlbumsFragment)
}
Что это значит? Т.е., если конструктора с @Inject не будет, как Dagger будет инжектить эти поля "if requested, but will not create new instances"?
Инициализация полей происходит после метода:
(activity?.application as App).getComponent().inject(this)
Т.е. если не будет этого вызова, поля не будут проинициализированы.
В случае, если объект Heater раньше не был создан? И в случае, если такой его обьект сейчас используется другим классом?
Если в Module() поля не обозначены как синглтоны, то будут созданы новые объекты, а если обозначены, то будет инжектится один экземпляр для всех классов.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах