我想将一个类绑定到一个实例,但是Guice不会让我,给我 Binding points to their 错误。我也希望实例成为单例。
所以给出更多背景知识。我有一个我想要绑定的类,但我不能,因为bindClass和instanceClass必须不同。
//This fails when bindClass==instanceClass
bind((bindClass)).to(instanceClass).in(Singleton.class);
标题有一个问题" Guice Beginner - 如何绑定具体类"可以在这里找到:
Guice Beginner - How to bind concrete classes?
接受的答案是不要绑定并且让#34; Just In Time"绑定完成工作。
但是,如果您想要实例的单身,该怎么做呢?
答案 0 :(得分:2)
// eager singleton always
bind(YourClass.class).asEagerSingleton();
// eager in prod, lazy in dev
bind(YourClass.class).in(Singleton.class);
在Binder class-level docs上列出了bind
声明中的许多其他变体:
bind(ServiceImpl.class).in(Singleton.class); // or, alternatively bind(ServiceImpl.class).in(Scopes.SINGLETON);
这些语句中的任何一个都将ServiceImpl类放入单例范围。 Guice将只创建一个ServiceImpl实例,并将其重用于此类型的所有注入请求。请注意,如果第二个绑定由注释限定,仍然可以绑定另一个ServiceImpl实例,如上例所示。 Guice并不过分担心会阻止您创建单个"单身人士的多个实例,只有让您的应用程序只共享一个实例,如果您告诉Guice您需要的话。
虽然简单地用@Singleton
标记类并依赖于JIT绑定也是有效的,但是根据Guice 验证图形并将绑定放在模块中是有好处的。急切地执行初始化。这在服务器上下文中尤其有用,因为更有可能在开始将实时流量重定向到新加载的服务器实例之前进行初始化。
在Scopes wiki page上查看有关急切/懒惰单身人士加载的更多信息。