javaguice:深度对象注入
我有类B、C和D。刚才,我想添加一个类a,它的属性完全绑定到应用程序配置中的值。使用Guice将值注入类A的最佳实践是什么javaguice:深度对象注入,java,dependency-injection,guice,Java,Dependency Injection,Guice,我有类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(); } } pub
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();
}
}
我能想到的一种可能性是将喷油器实例从D传递到B,并更改B s.t:
public class B {
public B(Injector injector) {
this.a = injector.getInstance(A.class);
}
}
这似乎是一种糟糕的形式,我还没有看到使用这种形式的在线示例。欢迎您提出任何建议。与其使用
新建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);
}
}
与其使用new
'ingA
、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);
}
}
虽然我总体上同意这个答案(+1),但我还是要明确每个构造函数都是预期被注入的构造函数,并将@Inject
添加到每个构造函数中。@OlivierGrégoire同意(这也是我通常编写代码的方式)。更新以反映建议。很抱歉问一下(第一天在这里使用Guice)-那么您如何创建D?injector.getInstance(D.class)?如果我想在另一个对象中创建B呢?如何将注射器放入范围?@user1836155是的,完全一样+尽管模块示例采用匕首式(@Module
)。Guice等价物会删除注释,扩展AbstractModule,并有一个configure
方法(可能是空的)。虽然我同意整个答案(+1),但我仍然会明确每个构造函数都是预期注入的构造函数,并将@Inject
添加到每个构造函数中。@OlivierGrégoire同意(这也是我通常编写代码的方式)。已更新以反映建议。很抱歉(在这里使用Guice的第一天)-如何创建D?injector.getInstance(D.class)?如果我只想在另一个对象中创建B怎么办?如何使注入器进入作用域?@user1836155是的,完全一样!+1的概念,但值得注意的是模块示例是匕首式(@Module
)的。等效的GUI将删除注释,扩展AbstractModule,并具有配置
方法(可能是空的)。