Где dagger2 хранит экземпляры с областью действия? - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть компонент с аннотацией @Singleton. Требуется DbModule. Я заглянул в сгенерированный класс и обнаружил, что существуют фабрики для функций DbModule (также аннотировано @Singleton). Фабрика напрямую использует функцию DbModule, поэтому каждый раз, когда вызывается метод фабрики get (), она создает новый экземпляр, и этот экземпляр никогда не сохраняется. Фабрика затем сохраняется в компоненте как поставщик. Итак, вопрос в том, как кинжал предоставляет один и тот же экземпляр для той же области видимости?

1 Ответ

0 голосов
/ 07 апреля 2020

Фабрика затем сохраняется в компоненте как провайдер.

Это почти верно, но не совсем. Сгенерированный код компонента выглядит примерно так:

this.provideDatabaseProvider = DoubleCheck.provider(DbModule_ProvideDatabaseFactory.create());

Метод DoubleCheck.provider возвращает экземпляр DoubleCheck, который делегируется исходному поставщику. Это, а не исходная фабрика, сохраняется в компоненте.

Реализация get в DoubleCheck затем вызывает делегат Provider ровно один раз и сохраняет результат. Каждый последующий вызов get возвращает экземпляр, сохраненный ранее.

...