在没有的情况下在Guice中绑定

时间:2015-09-15 19:29:01

标签: java guice

我有一个问题: 通常在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);

感谢答案

1 个答案:

答案 0 :(得分:10)

在Guice文档中,没有bind的{​​{1}}语句称为Untargeted Binding(在wiki URL中拼写错误为“Untargetted Bindings”)。从那个维基页面:

  

您可以在不指定目标的情况下创建绑定。这对于由to@ImplementedBy注释的具体类和类型最有用。一个未经证实的[sic]绑定通知注入器一个类型,因此它可能会急切地准备依赖。

你会在Guice看到这个有三个目的:

  1. 通过急切加载轻微提升性能。

    当Guice遇到一个没有绑定的依赖项(例如,A类)时,它会检查该类是否可以通过@ProvidedBy注释或零arg公共构造函数注入它。 。如果是这样,Guice会创建Just-In-Time binding(或“隐式绑定”)。这是通过反射完成的,并且可能导致其他绑定的级联(请求A检查A,然后是A的依赖关系B,然后是B的依赖关系C,依此类推),这可能会导致运行时速度降低。

    通过先发制人地进行无针对性的绑定,您可以告知Guice有关可注射类的信息,该类允许它在启动时支付反射成本,以获得更可预测的性能。

  2. 如果Guice无法创建您注入的对象,则会抛出异常,但在@ImplementedBy或@ProvidedBy(或@InjectgetInstance的情况下)Guice不会失败,如果它还没有检查缺少绑定的班级。通过列出您使用的类,Guice将按照(1)中的预先分析这些对象,但也会在应用启动时识别缺少绑定。这在开发过程中可能很方便,尤其是在应用程序启动后长时间注入injectMembersgetInstance的对象时;你可能更愿意立即失败。

  3. 虽然默认情况下启用了隐式绑定,但可以通过requireExplicitBindings禁用它们。这意味着任何注入的类都需要具有关联的绑定,包括具有合格构造函数的类。非目标绑定可以轻松解决这种情况。