我是Guice Injection的新手。如何将一个类注入一个我将在静态方法中使用的静态变量?
这是我想在doLocalize()方法中使用注入变量b的类。
public class A {
@Inject //Trying to inject this class
private static B b;
// Private constructor to prevent initialization.
private A() {}
public static String doLocalize(String word) {
return b.localize(word);
}
}
这是我想要执行guice注入的Module类。
注意:我不能更改MyModule和B类,因为它来自另一个依赖项。
public class MyModule extends AbstractModule {
public void configure() {
bind(B.class);
// some other binds
}
}
我想在班级A中注入课程
public class B {
public String localize(String word) {
//does some stuff
//returns a modified string
}
}
答案 0 :(得分:0)
使用requestStaticInjection
。这在wiki中有所描述。
注意:我不能更改MyModule和B类,因为它来自另一个依赖项。
然后你需要一个新模块。
class A {
@Inject
public static B b;
static void a(){b.b();}
}
class B {
@Inject public PrintStream out;
void b() { out.println("Value: b"); }
}
class MyModule extends AbstractModule {
public void configure() {
bind(B.class);
bind(PrintStream.class).toInstance(System.out);
}
}
class AModule extends AbstractModule {
public void configure() {
requestStaticInjection(A.class);
}
}
@Test
public void test() {
Guice.createInjector(new AModule(), new MyModule()); // Can be in any order
A.a();
assertThat(A.b, is(not(nullValue())));
}
答案 1 :(得分:0)
我建议在A
上使用非静态方法,原因有几个。
我建议:
public class A {
private final B b;
@Inject
private A(B b) {
this.b = b;
}
public String doLocalize(String word) {
return b.localize(word);
}
}
请注意,b
是最终的,这很好,因为您不希望它是更改,因为最终字段在多线程环境中具有某些保证。
写完这篇文章后,我不禁要问你为什么需要A
课程。相反,无论代码调用A.doLocalize()
而不是注入B
实例?