Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javaguice:深度对象注入_Java_Dependency Injection_Guice - Fatal编程技术网

javaguice:深度对象注入

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

我有类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();
     }
 }
我能想到的一种可能性是将喷油器实例从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
'ing
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);
    }
}

虽然我总体上同意这个答案(+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,并具有
配置
方法(可能是空的)。