GIN绑定的范围是什么?

时间:2012-02-24 21:26:59

标签: gwt dependency-injection guice gin

我想知道两个绑定的范围是什么:

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

bind(PermissionManager.class);

我已阅读过JavaDocs,它们如下。对于Singleton:

/**
* 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 个答案:

答案 0 :(得分:3)

在Gin的实际术语中,Singleton范围在每个客户端实例考虑时最有意义,甚至更精确地考虑每个Ginjector实例。如果您错误地通过GWT.create实例两次制作两个Ginjectors,那么每个实例可能会有一个'singleton',因为每个Ginjector只能跟踪它管理的实例。

因此,每次加载应用程序时,它都会有自己的单例。如果用户在两个不同的选项卡中两次打开相同的应用程序,则每个选项卡都有自己的单例。您可以将每个选项卡视为自己的JVM,因为它将拥有自己的所有类的副本,并且无法在另一个窗口上进行通信或调用方法*。

对于没有范围,是的,默认情况下每个实例都不同。当某个类型为@Inject时,它将是一个新实例,但如果您@Inject Provider为某个字段,则每次调用get()时都可以获得新鲜的实例。这有助于轻松获取几个新注入的实例。

单身人士在两个主要案例中使用是有意义的

  • 当实例保持共享状态时,需要在多次注入中共同 - 最常见的情况。
  • 当实例创建成本高时 - 在服务器上这通常是作为池完成的,因此只创建了X个对象,但客户端上昂贵的对象往往是视图,有很多小部件,并且通常不需要多个。

*可以在另一个窗口上调用方法,但是你需要通过发布消息来使用浏览器的功能,而不是仅仅来回传递一个对象。

答案 1 :(得分:2)

单身人士只能由您创建的顶级Ginjector创建一次(对于大多数应用程序,您只创建一个Ginjector)。

每次将未绑定对象作为依赖项注入另一个对象时,都会创建它。所以每个实例都会有所不同。如果你不打算对它进行范围化,你实际上不需要编写bind(SomeClass.class)(或者做绑定DSL可以让你做绑定的任何其他事情)。只需拥有默认构造函数或将@Inject添加到构造函数中,Gin就可以创建它。

通常情况下,当你使用Guice或Gin时,除非你有充分的理由不这样做,否则你要留下未展开的东西。我建议阅读Guice documentation about scopes