Как проверить Guice Singleton? - PullRequest
3 голосов
/ 22 мая 2010

Guice Singletons странные для меня

Сначала я подумал, что

IService ser = Guice.createInjector().getInstance(IService.class);
System.out.println("ser=" + ser);
ser = Guice.createInjector().getInstance(IService.class);
System.out.println("ser=" + ser);

будет работать как синглтон, но возвращает

ser=Service2@1975b59
ser=Service2@1f934ad

все в порядке, это не должно быть легко.

Injector injector = Guice.createInjector();
IService ser = injector.getInstance(IService.class);
System.out.println("ser=" + ser);
ser = injector.getInstance(IService.class);
System.out.println("ser=" + ser);

работает как синглтон

ser=Service2@1975b59
ser=Service2@1975b59

Так что мне нужно иметь статическое поле с инжектором (Singleton for Singletons)

как передать ему модуль для тестирования?

Ответы [ 2 ]

12 голосов
/ 22 мая 2010

При использовании Guice вы должны создать ровно один инжектор на JVM. Обычно вы создаете его в точке входа вашего приложения (т.е. в вашем методе public static void main). Если вы набираете createInjector несколько раз в своем приложении, возможно, вы неправильно используете Guice!

Синглтоны - это экземпляр за инжектором. Обратите внимание, что это , а не экземпляр-на-JVM. Лучший способ получить ссылку на синглтон - это ввести его. Другой способ - попросить один-единственный экземпляр инжектора дать его вам.

0 голосов
/ 22 мая 2010

Вы действительно должны сделать немного больше тестирования (и чтения), прежде чем делать дикие, неточные обвинения, подобные этому. Я хорошо использую Guice для управления экземплярами-синглтонами.

Как выглядят привязки вашего модуля? Шаблон синглтона в GoF - это просто способ обеспечить наличие одного экземпляра класса, но использование static делает его на самом деле плохим выбором. Потребность в синглтоне заключается в том, что во время работы приложения доступен только один экземпляр класса.

Следующее - это все, что нужно для создания одноэлементного экземпляра с использованием Guice:

public class myModule extends AbstractModule {
    protected void configure() {
        bind(Service.class).to(ServiceImpl.class).in(Singleton.class);
    }
}

Когда вы попросите Guice предоставить вам экземпляр, вы получите тот же экземпляр, если вы не сделаете какую-то уникальную область видимости самостоятельно. По умолчанию синглтон будет для текущего Injector экземпляра.

...