У меня проблемы с пониманием как работают одноэлементные экземпляры 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 создан. Я действительно не понимаю, почему переключатель должен иметь значение - я вижу, что последний способ «лучше», но я ожидал бы, что оба будут работать правильно, поэтому мне просто интересно, не ошибаюсь ли я здесь ... ?
Извините за длину,
Спасибо за помощь!