一个简单的例子:
class C{}
class B{
@Inject C c;
void doSomething(){
System.out.println(c);
}
}
class A{
@Inject A(B b){
b.doSomething();//this works fine and prints the c object
}
}
现在,如果我使用反射创建B对象:
class A{
A(){
// blah blah blah
B b = constructor.newInstance();
b.doSomething(); // sigh, this prints null!!!
}
}
所以,我的问题是:如果我使用反射创建B对象(而不是通过Guice注入),如何使注入工作?
答案 0 :(得分:8)
注入MembersInjector<B>
并使用它来注入B
的字段和方法:
class A {
@Inject A(MembersInjector<B> bInjector) {
...
B b = constructor.newInstance();
bInjector.injectMembers(b);
b.doSomething();
}
}
这种方法最好的部分是Guice可以提前准备B的绑定。如果注入B会出现问题,你会发现创建注入器的时间,通常是应用程序启动。这比Injector.injectMembers()
更受欢迎,因为在调用它之前不会失败。
答案 1 :(得分:2)
您可以致电injector.injectMembers(myObject)
,但我怀疑这是否遵循最佳做法。
答案 2 :(得分:0)
要么/或者:你可以将它置于DI引擎的控制之下或自己接受它,但是很难同时拥有它们。
我能想到的唯一方法是告诉DI引擎一个可能使用反射来创建实例的工厂方法。但这是唯一可以想到的机制。