我有一个问题: 通常在Guice中我使用bind(classe).to(another_class_Implementation)...
但是我在代码源中发现他们只使用了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);
感谢答案
答案 0 :(得分:10)
在Guice文档中,没有bind
的{{1}}语句称为Untargeted Binding(在wiki URL中拼写错误为“Untargetted Bindings”)。从那个维基页面:
您可以在不指定目标的情况下创建绑定。这对于由
to
或@ImplementedBy
注释的具体类和类型最有用。一个未经证实的[sic]绑定通知注入器一个类型,因此它可能会急切地准备依赖。
你会在Guice看到这个有三个目的:
通过急切加载轻微提升性能。
当Guice遇到一个没有绑定的依赖项(例如,A类)时,它会检查该类是否可以通过@ProvidedBy
注释或零arg公共构造函数注入它。 。如果是这样,Guice会创建Just-In-Time binding(或“隐式绑定”)。这是通过反射完成的,并且可能导致其他绑定的级联(请求A检查A,然后是A的依赖关系B,然后是B的依赖关系C,依此类推),这可能会导致运行时速度降低。
通过先发制人地进行无针对性的绑定,您可以告知Guice有关可注射类的信息,该类允许它在启动时支付反射成本,以获得更可预测的性能。
如果Guice无法创建您注入的对象,则会抛出异常,但在@ImplementedBy或@ProvidedBy(或@Inject
或getInstance
的情况下)Guice不会失败,如果它还没有检查缺少绑定的班级。通过列出您使用的类,Guice将按照(1)中的预先分析这些对象,但也会在应用启动时识别缺少绑定。这在开发过程中可能很方便,尤其是在应用程序启动后长时间注入injectMembers
或getInstance
的对象时;你可能更愿意立即失败。
虽然默认情况下启用了隐式绑定,但可以通过requireExplicitBindings
禁用它们。这意味着任何注入的类都需要具有关联的绑定,包括具有合格构造函数的类。非目标绑定可以轻松解决这种情况。