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" 功能的好方法,但也像反射一样,如果你做错了,它也会导致极其奇怪的运行时错误。
我的问题就在这里;我不知道我是否可以用 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" 功能的好方法,但也像反射一样,如果你做错了,它也会导致极其奇怪的运行时错误。