繁体   English   中英

Guice初学者-如何绑定具体课程-Singleton?

[英]Guice Beginner - How to bind concrete classes - Singleton?

我想将一个类绑定到一个实例,但是Guice不允许我这样做,给我绑定点指向自身错误。 我也希望实例是单例。

因此要给更多背景。 我有一个要绑定的类,但是由于bindClass和instanceClass必须不同,所以不能。

//This fails when bindClass==instanceClass
bind((bindClass)).to(instanceClass).in(Singleton.class);

这里有一个标题为“ Guice Beginner-如何绑定具体类”的问题,可以在这里找到:

Guice初学者-如何绑定具体课程?

可接受的答案是不绑定,让“ Just In Time”绑定完成任务。

但是,如果您想要实例的单例怎么办?

// eager singleton always
bind(YourClass.class).asEagerSingleton();

// eager in prod, lazy in dev
bind(YourClass.class).in(Singleton.class);

Binder类级别的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 验证图形并急于执行初始化的角度来看,将绑定放在Module中还是有好处的。 这在服务器环境中尤其有用,因为在开始将实时流量重定向到新加载的服务器实例之前,可能会发生初始化。

Scopes Wiki页面上查看有关eager / lazy singleton加载的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM