[英]How to use guice injection to inject a Class in a class with static methods?
我是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
}
}
我想注入我的班级中的班级
public class B {
public String localize(String word) {
//does some stuff
//returns a modified string
}
}
使用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())));
}
由于一些原因,我建议在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
是最终的,这很好,因为您不希望对其进行更改,并且因为final字段在多线程环境中具有一定的保证。
写完这些之后,我想知道为什么您需要A
类。 相反,可以将任何代码调用A.doLocalize()
替换为B
实例吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.