Guice нетерпеливые / ленивые синглтонные экземпляры

У меня проблемы с пониманием как работают одноэлементные экземпляры Guice. Я прочитал доступную документацию (здесь - http://code.google.com/p/google-guice/wiki/Scopes ), но все еще не могу понять некоторые вещи:

1) Я интегрировал Guice с Tomcat и установил некоторые привязки в ServletModule:

bind(MyServlet.class).asEagerSingleton();
serve("myUrl").with(MyServlet.class);
serve("myOtherUrl").with(MyOtherServlet.class);

(где у класса MyOtherServlet есть аннотация @Singleton над ним) Я намеревался создать два сервлетов, где один экземпляр активно создается, а другой - нет. Однако похоже, что строка «serve ... with ...» автоматически создает экземпляры объектов сервлетов, даже если этот класс не привязан как активный синглтон. В приведенной выше ссылке упоминается разница между Guice, работающим в Stage .Development и Stage.Production - однако это все еще происходило, даже когда я явно использовал Stage.Development (который в любом случае используется по умолчанию). Есть ли способ избежать этого?

2) (продолжение 1) Пытаясь обеспечить создание экземпляра MyServlet первым, даже несмотря на то, что все сервлеты сейчас активно создаются, я изменил порядок модулей (и операторов привязки) при создании инжектора, чтобы сначала появилась привязка для MyServlet.Однако я обнаружил, что он по-прежнему создается позже, чем некоторые другие привязки (классов, не являющихся сервлетами), которые имели форму:

bind(MyInterface.class).to(MyClass.class).asEagerSingleton()

, хотя эти другие привязки появились позже в порядке модулей / привязок. Я изучил это и обнаружил, что Guice просто создает экземпляры нетерпеливых синглтонов, которые были связаны формой "bind ... to ... asEagerSingleton ()", прежде чем он выполнит "bind ... asEagerSingleton ()", и поэтому я решил это, изменив строку: bind (MyServlet.class) .asEagerSingleton (); в: bind (MyServletDummyInterface.class) .to (MyServlet.class ) .asEagerSingleton ()

, и это действительно сработало. Тем не менее, я бы предпочел избегать фиктивного интерфейса только для решения этой проблемы, поэтому мне было интересно, есть ли у кого-нибудь лучшее решение для этого ...?

3) У меня есть два модуля Guice - один ServletModule и один AbstractModule. {{ 1}} ServletModule configureServlets () имеет следующую привязку:

serve("aUrl").with(SomeServlet.class);

configure () AbstractModule имеет следующие привязки:

bind(SomeImpl.class).asEagerSingleton();
bind(SomeInterface.class).to(SomeImpl.class).in(Singleton.class);

Кроме того, класс SomeServlet имеет внедренное поле типа SomeInterface и аннотацию @Singleton на вершине класса.

Теперь можно было бы ожидать, что при создании инжектора будет создан экземпляр класса SomeImpl, и тот же экземпляр будет внедрен в экземпляр SomeServlet. Как упоминалось ранее, сервлеты, ограниченные оператором "serve ... with ...", также, кажется, с нетерпением создаются, но в любом случае должен быть создан только один экземпляр объекта SomeImpl. Тем не менее, по какой-то причине при этом у меня были созданы два объекта SomeImpl. Чтобы обойти это, я немного смешал две строки в configure (), и вместо приведенных выше у меня были следующие строки:

bind(SomeImpl.class).in(Singleton.class)
bind(SomeInterface.class).to(SomeImpl.class).asEagerSingleton();

, а затем все работало нормально, и я получил только один экземпляр SomeImpl создан. Я действительно не понимаю, почему переключатель должен иметь значение - я вижу, что последний способ «лучше», но я ожидал бы, что оба будут работать правильно, поэтому мне просто интересно, не ошибаюсь ли я здесь ... ?



Извините за длину,
Спасибо за помощь!

10
задан user976850 8 November 2011 в 16:12
поделиться