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

Does guice allow injectMembers into a constructor?

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

public class Foo {
 private final Bar bar;

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

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

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

对于相同的效果,可能更好的替代方法是:

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

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

顺便说一句,这个例子展示了一些不好的做法:

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