我有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);
    }
}


这似乎是不好的形式,我还没有看到在线示例使用此方法。任何建议都将受到欢迎。

最佳答案

而不是newABC加上符号,为什么不要求将它们作为依赖项传入。像这样的东西:

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);
    }
}

09-10 13:15
查看更多