Синглотоны в кинжале 1.x

При использовании кинжала, я обнаружил, что я получаю несколько экземпляров синглтона, когда я ввожу его туда, где он мне нужен. Я аннотировал класс и метод предоставления с помощью @Singleton. Кто-нибудь может подумать, почему это происходит?

Edit:

Если это помогает, я выполнил ту же структуру для своего приложения, что и образец приложения в Dagger GitHub (https://github.com/square/dagger/tree/master/examples/android-activity-graphs). Я пытаюсь получить Singleton в базовой деятельности и пару сторонних классов, предоставляемых с использованием @Provides в пользовательском классе Application. Это потому, что я плюсую модули для каждого действия на исходный графа объектов?

(PS: Я новичок в Dagger и DI в целом, поэтому я буду благодарен, если вы сможете дать объяснение, чтобы я мог учиться. Спасибо.)

Ответ 1

@Singleton, в Dagger 1.x действует не так, как вы думаете. Определение спецификации JSR-330 в @Singleton javadoc - "один на граф", и именно так интерпретирует его Кинжал.

Итак, если у вас есть что-то, помеченное как @Singleton, и оно реализовано в вашем графике приложения (в отличие от графика с более коротким сроком жизни), вы получаете один экземпляр для каждого приложения.

Если у вас есть элемент аннотированный @Singleton, то в модулях, которые вы используете для настройки графика активности (т.е. получается из части графика, указанного модулем, используемым в операции plus()), вы будете получить один-на-активность-график.

Если вам нужно что-то одноразовое приложение, вам нужно убедиться, что он создается как часть графика приложения. Вы можете сделать это одним из двух способов. Или явно укажите его с помощью метода @Provides из вашего прикладного модуля (модулей), или вы можете перечислить его как один из классов в @Module (injects =...) в прикладном модуле.

(Если вы не отметили его @Singleton, чем вы получите один на сайт инъекции.)

Итак, помните, что график, созданный с помощью функции plus(), рассматривается как отдельный граф, который указывает на график, из которого он был порожден, и обертывает его, может обращаться к экземплярам внутри него, но это не тот же граф.

Примечание. Dagger 2.x улучшает это и поддерживает настраиваемые аннотации, хотя механизм аналогичен, с одним графом (компонентом) для аннотации области видимости, с родительским/дочерним отношением между графиками более широких/более узких времен жизни