2013-07-03 2 views
18

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

Edit:

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

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

ответ

39

@Singleton, в Dagger 1.x , действует иначе, чем вы думаете. Спецификация спецификации JSR-330 в javaadoc @Singleton «одна на график», и именно так интерпретирует ее Кинжал.

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

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

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

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

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

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

+0

Спасибо за освобождение. Когда вы говорите spec, вы имеете в виду JSR330? – Raghuveer

+0

Да. Извините, я отредактирую ответ. –

+0

@ChristianGruber Как это применимо к инъецированным Singleton конструкторам, используемым в разных подграфах родительского графа? Означает ли это один грамм, в котором используется класс, за исключением случаев, когда он уже существует в родительском графе? – vinc3m1