我有B,C和D类。刚才,我想添加一个A类,其属性完全绑定到应用程序配置中的值。使用Guice将值注入A类的最佳实践是什么?
public class A {
public A(@Named("id") String id, ..., @Named("attr") String attr) {
....
}
}
public class B {
public B() {
this.a = new A();
}
}
public class C {
public C() {
this.b = new B();
}
}
public class D {
@Inject
private Injector injector;
public D() {
this.c = new C();
}
}
我可以想到的一种可能性是保持将Injector实例从D传递到B并更改B s.t .:
public class B {
public B(Injector injector) {
this.a = injector.getInstance(A.class);
}
}
这似乎是不好的形式,我还没有看到在线示例使用此方法。任何建议都将受到欢迎。
最佳答案
而不是new
为A
,B
和C
加上符号,为什么不要求将它们作为依赖项传入。像这样的东西:
class A {
private final String id;
private final String attr;
@Inject
A(String id, String attr) {
this.id = id;
this.attr = attr;
}
}
class B {
private final A a;
@Inject
B(A a) {
this.a = a;
}
}
class C {
private final B b;
@Inject
C(B b) {
this.b = b;
}
}
class D {
private final C c;
@Inject
D(C c) {
this.c = c;
}
}
然后根据需要使用Guice创建和注入实例:
@Module
public class Module {
@Provides
public A provideA(@Named("id") String id, @Named("attr") String attr) {
return A(id, attr);
}
@Provides
public B provideB(A a) {
return new B(a);
}
@Provides
public C provideC(B b) {
return new C(b);
}
@Provides
public D provideD(C c) {
return new D(c);
}
}