我有个问题:
通常在Guice中我使用bind(class).to(另一个类实现)...
但是我在代码源中发现他们仅使用了bind(class)(没有“.to(another_class_Implementation)”部分)...
这是什么意思(bind(class) 不带“to 或 as”)?
这是有问题的代码部分:
public class RestModule extends AbstractModule {
@Override
protected void configure() {
bind(RootResource.class);
bind(DeveloperUtilsRedirector.class);
bind(M34Repository.class).to(M34RepositoryImpl.class);
bind(IGARepository.class).to(IGARepositoryImpl.class);
感谢您的回答
A bind
没有的声明to
被称为非目标结合(在 wiki URL 中被错误拼写为“Untargetted Bindings”)在 Guice 文档中。从该维基页面:
您可以在不指定目标的情况下创建绑定。这对于由以下任一注释的具体类和类型最有用@ImplementedBy
or @ProvidedBy
。无目标的[原文如此]绑定通知注入器有关类型的信息,因此它可能会急切地准备依赖项。
您将在 Guice 中看到它用于三个目的:
-
通过急切加载略微提高性能。
当 Guice 遇到没有绑定的依赖项(例如,类 A)时,它会检查该类以查看是否可以通过@Inject
带注释或零参数的公共构造函数。如果是这样,Guice 会创建一个即时绑定(或“隐式绑定”)。这是通过反射完成的,并且可能会导致其他绑定的级联(请求 A 检查 A,然后请求 A 的依赖项 B,然后 B 的依赖项 C,等等),这可能会导致运行时速度减慢。
通过先发制人地进行非目标绑定,您可以向 Guice 告知可注入类,这允许它在启动时支付反射成本以获得更可预测的性能。
-
如果 Guice 无法创建你注入的对象,它会抛出异常,但在 @ImplementedBy 或 @ProvidedBy (或getInstance
or injectMembers
) 如果 Guice 尚未检查缺少绑定的类,则它不会失败。通过列出您使用的类,Guice 将像 (1) 中那样预先分析这些对象,但也会在应用程序启动时识别缺少绑定。这在开发过程中可能会很方便,特别是当您使用以下方式注入对象时getInstance
or injectMembers
应用程序启动后很长时间;您可能希望失败立即发生。
-
尽管默认情况下启用隐式绑定,但可以通过以下方式禁用它们requireExplicitBindings。这意味着任何注入的类都需要具有关联的绑定,包括具有合格构造函数的类。无目标绑定可以轻松解决这种情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)