我理解使用构造函数注入优于setter注入的好处,但在某些情况下,我必须坚持使用基于setter的注入。我的问题是如何使用injector.injectMembers()方法注入所有基于setter的注入类的成员?
//I am calling this method in init method of my application
private static final Injector injector = Guice.createInjector(new A(), new B());
//Injecting dependencies using setters of all classes bound in modules A and B
injector.injectAllMembers()??
答案 0 :(得分:11)
为什么需要手动注入依赖项?
Guice会自动将依赖项注入字段和方法。 使用:
YourClass yourClass = injector.getInstance(YourClass.class);
Guice文档:
每当Guice创建一个实例时,它就会发生 自动执行此注入 (在首次执行构造函数之后 注射),所以,如果你能够让 Guice为您创建所有物品, 你永远不需要使用这种方法。
您需要将成员自己注入到手动创建的实例中,如下所示:
YourClass yourClass = new YourClass();
injector.injectMembers(yourClass);
或者您可以使用类似的东西:
public class YourClassProvider implements Provider<YourClass> {
private final Injector injector;
@Inject
public YourClassProvider(Injector injector) {
this.injector = injector;
}
public YourClass get() {
YourClass yourClass = new YourClass();
injector.injectMembers(yourClass);
return yourClass;
}
}
在任何情况下,YourClass的setter都应该使用@Inject注释。