[英]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.