Каковы области привязок GIN? - PullRequest
3 голосов
/ 25 февраля 2012

Интересно, какие области имеют две привязки:

bind(PermissionManager.class).in(Singleton.class);

и

bind(PermissionManager.class);

Я прочитал JavaDocs, они следующие.Для синглтона:

/**
* Apply this to implementation classes when you want only one instance
* (per {@link Injector}) to be reused for all injections for that binding.
*
* @author crazybob@google.com (Bob Lee)
*/

Без границ:

/**
* No scope; the same as not applying any scope at all.  Each time the
* Injector obtains an instance of an object with "no scope", it injects this
* instance then immediately forgets it.  When the next request for the same
* binding arrives it will need to obtain the instance over again.
*
* <p>This exists only in case a class has been annotated with a scope
* annotation such as {@link Singleton @Singleton}, and you need to override
* this to "no scope" in your binding.
*
* @since 2.0
*/

Что это означает на практике?Являются ли синглтоны на клиента или JVM?Для какой области видимости каждый экземпляр отличается?

Ответы [ 2 ]

3 голосов
/ 26 февраля 2012

С практической точки зрения для Gin область применения Singleton наиболее целесообразна, если рассматривать ее для каждого экземпляра клиента или даже более точно для каждого экземпляра Ginjector. Если вы допустите ошибку, сделав два Ginjectors, GWT.create дважды используя экземпляр, у вас, вероятно, будет один 'singleton' на экземпляр, поскольку каждый Ginjector может отслеживать только экземпляры, которыми он управляет.

Таким образом, каждый раз, когда ваше приложение загружается, оно будет иметь свой собственный синглтон. Если пользователь дважды открывает одно и то же приложение на двух разных вкладках, у каждой будет свой собственный синглтон. Вы можете рассматривать каждую вкладку как собственную JVM, так как она будет иметь собственную копию всех классов и не сможет общаться или вызывать методы * в другом окне.

Без контекста, да, по умолчанию каждый экземпляр отличается. Когда тип @Inject ed, он будет новым экземпляром, но если вы @Inject a Provider для поля, каждый раз, когда вы вызываете get(), вы можете получить новый экземпляр. Это может быть полезно, чтобы легко получить несколько новых внедренных экземпляров.

Синглеты имеют смысл использовать в двух основных случаях

  • Когда экземпляр содержит общее состояние, которое должно быть общим для многих инъекций - наиболее распространенный случай.
  • Когда создание экземпляра стоит дорого - на сервере это часто делается как пул, поэтому создается не более X объектов, но дорогие объекты на клиенте, как правило, являются представлениями с большим количеством виджетов и, как правило, более одного не требуется.

* Можно вызывать методы в другом окне, но для этого нужно использовать возможности браузера, публикуя сообщение, а не просто передавая объект туда-сюда.

2 голосов
/ 25 февраля 2012

Синглтоны создаются только один раз созданным Ginjector верхнего уровня (и для большинства приложений вы всегда создаете только один Ginjector).

Объекты с незаданной областью создаются каждый раз, когда они вводятся как зависимость в другойобъект.Так что каждый экземпляр будет отличаться.На самом деле вам не нужно писать bind (SomeClass.class), если вы не собираетесь его ограничивать (или делать любые другие вещи, которые DSL связующего может позволить вам сделать с привязкой).Просто наличие конструктора по умолчанию или добавление @Inject в конструктор позволит Gin создать его.

Как правило, когда вы используете Guice или Gin, вы хотите оставить вещи незаданными, если у вас нет веских причин не делать этого.,Я бы рекомендовал прочитать документацию Guice об областях применения .

...