繁体   English   中英

Guice Inject Field中的字段不是由Guice创建的

[英]Guice Inject Field in class not created by Guice

我有一个这样的类,我在我的代码中创建自己:

class StarryEyes {
   @Inject MyValidator validator;

   public StarryEyes(String name) {
      //..
   }

   public doSomething() {
      // validator is NULL
   }
}

我希望Guice注入一个验证器实例,它有一个@Singleton注释。 我有一个在启动时加载的模块,它包含以下行:

bind(MyValidator.class);

但是,它似乎不起作用,因为“验证器”始终为空。 我试过了很多变化,比如:

bind(MyValidator.class)toInstance(new MyValidator());

或其他类似的事情。 这不是Guice应该如何运作的吗?

通常Guice需要创建对象来注入它们。 如果您只是调用new StarryEyes(name) ,Guice将永远不会看到该对象,因此它无法注入它。 您可以做的一件事是在创建对象后调用injector.injectMembers(obj) 但是,我不建议您这样做,因为您应该避免在代码中引用注入器。

你真正想要的是Assisted Inject 使用Assisted Inject,您将为您的类声明构造函数,如下所示:

@Inject public StarryEyes(MyValidator validator, @Assisted String name)

这意味着validator是Guice应该注入的参数,而name必须是“辅助的”(即,在创建实例时提供)。

然后,您创建一个这样的界面:

public interface StarryEyesFactory {
  StarryEyes create(String name);
}

通过Assisted Inject,Guice可以为您实现该工厂。 你像这样绑定它:

bind(StarryEyesFactory.class).toProvider(
    FactoryProvider.newFactory(StarryEyesFactory.class, StarryEyes.class));

然后,您可以在任何想要创建它的实例的地方注入StarryEyesFactory 如果您以前调用过new StarryEyes(name) ,现在调用starryEyesFactory.create(name) 在工厂中调用create(name)时,它将获取名称并将其传递给构造函数并提供绑定的验证器本身。

从Guice 3开始 ,您可以使用FactoryModuleBuilder执行此操作:

install(new FactoryModuleBuilder().build(StarryEyesFactory.class));

暂无
暂无

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

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