guice是否允许injectMembers进入构造函数?

时间:2015-03-14 22:40:06

标签: java constructor guice inject

我的问题在这里;我不知道我是否可以用guice做到这一点:

public class Foo {
 private final Bar bar;

 @Inject
 public Foo(Injector injector) {
  this.bar = new Bar();
  injector.injectMembers(bar);
 }
}

*栏会被正确注入吗?谢谢

1 个答案:

答案 0 :(得分:3)

是的,这应该有效。构造一个实例以引发其他注入的过程是可以的(实际上,这是依赖注入正常工作的方式)。

对于相同的效果,可能更好的选择是:

@Inject Foo(Provider<Bar> barProvider) {
  this.bar = barProvider.get();
}

因为这会导致Guice构造Bar实例并注入其字段。

顺便说一下,这个例子说明了一些不好的做法:

  • 制作@Inject构造函数public是不好的形式。依赖注入的全部意义在于使您的类的客户端不需要知道您的类的依赖关系。如果他们直接构建类,那就被颠覆了。如果你真的想要一个“默认”构造函数,只需提供一个非@Inject构造函数或工厂方法(在类或包中的其他地方)。
  • 如果可能,通常最好避免使用
  • injectMembers。只要有可能,更喜欢构造函数注入。除此之外,如果您要跨线程共享实例,这是必要的,因为injectMembers可能无法保证安全发布。与任何后构造函数初始化步骤一样,它也使类不变量更难以推理。
  • 正如您可能推断的那样,注入Injector是一种代码气味。除了非常重的元编程或框架代码之外,它几乎不应该是必要的。像反射一样,它可以是构建“魔术”功能的好方法,但也像反射一样,如果你做错了,它也会导致非常奇怪的运行时错误。