Ответ 1
@Singleton
, в Dagger 1.x действует не так, как вы думаете. Определение спецификации JSR-330 в @Singleton
javadoc - "один на граф", и именно так интерпретирует его Кинжал.
Итак, если у вас есть что-то, помеченное как @Singleton
, и оно реализовано в вашем графике приложения (в отличие от графика с более коротким сроком жизни), вы получаете один экземпляр для каждого приложения.
Если у вас есть элемент аннотированный @Singleton
, то в модулях, которые вы используете для настройки графика активности (т.е. получается из части графика, указанного модулем, используемым в операции plus()), вы будете получить один-на-активность-график.
Если вам нужно что-то одноразовое приложение, вам нужно убедиться, что он создается как часть графика приложения. Вы можете сделать это одним из двух способов. Или явно укажите его с помощью метода @Provides из вашего прикладного модуля (модулей), или вы можете перечислить его как один из классов в @Module (injects =...) в прикладном модуле.
(Если вы не отметили его @Singleton
, чем вы получите один на сайт инъекции.)
Итак, помните, что график, созданный с помощью функции plus(), рассматривается как отдельный граф, который указывает на график, из которого он был порожден, и обертывает его, может обращаться к экземплярам внутри него, но это не тот же граф.
Примечание. Dagger 2.x улучшает это и поддерживает настраиваемые аннотации, хотя механизм аналогичен, с одним графом (компонентом) для аннотации области видимости, с родительским/дочерним отношением между графиками более широких/более узких времен жизни