当注入有自己的依赖项时如何使用 java guice

问题描述 投票:0回答:1

我正在尝试弄清楚 Guice 是如何工作的,并且正在努力寻找适合我的特定场景的示例/教程。

假设我有以下课程:

  • ClassA 已注入 ClassB
  • B级
  • ClassC 已注入 ClassA

我遇到的问题是 ClassA 没有无参数构造函数,并且也有自己的依赖项。我不确定如何使用注入器注入这些类型的依赖项。

A级

public class ClassA {

    private final int number;
    private final ClassB classB;

    @Inject
    public ClassA(int number, ClassB classB) {
        this.number = number;
        this.classB = classB;
    }

    public String message() {
        return "ClassA number: " + number + ", ClassB number: " + classB.getNumber();
    }

}

B类

@Getter
public class ClassB {

    private final int number;

    @Inject
    public ClassB(@Assisted int number) {
        this.number = number;
    }

}

C级

import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;

public class ClassC {

    final private int number;
    final private ClassA classA;

    @Inject
    public ClassC(@Assisted int number, ClassA classA) {
        this.number = number;
        this.classA = classA;
    }

    public String message() {
        String message = classA.messsage();
        return message + ", ClassC number: " + number;
    }

}

我有一个带有

create(int number)
方法的所有类的工厂接口。在模块配置方法中,我有以下内容:

install(new FactoryModuleBuilder().build(ClassAFactory.class));
install(new FactoryModuleBuilder().build(ClassBFactory.class));
install(new FactoryModuleBuilder().build(ClassCFactory.class));

以下是我完全迷失的地方,我该如何将它们混合在一起?

Injector injector = Guice.createInjector(new AppModule());

ClassBFactory bFactory = injector.getInstance(ClassBFactory.class);
ClassB b = bFactory.create(2);
ClassAFactory aFactory = injector.getInstance(ClassAFactory.class);
ClassA a = aFactory.create(1);
ClassCFactory cFactory = injector.getInstance(ClassCFactory.class);
ClassC c = cFactory.create(3);

System.out.println(c.message());

以上输出:

ClassA number: 3, ClassB number: 3, ClassC number: 3

对我来说,如果可以在这种情况下使用提供程序而不是工厂,请有人向我展示如何解决提供程序中的这些依赖关系的示例?

java guice
1个回答
0
投票

不管你信不信,这实际上是一个功能。它正在创建具有相同值的相应实例。

ClassBFactory bFactory = injector.getInstance(ClassBFactory.class);
ClassB b = bFactory.create(2);

这将创建一个新的

ClassB
实例,其
number
2

ClassAFactory aFactory = injector.getInstance(ClassAFactory.class);
ClassA a = aFactory.create(1);

ClassA
的构造函数采用
number
ClassB
的实例。但是,您在上面创建的
ClassB
实例未绑定,并且不可用于注入器。不过,由于 ClassB
 可以使用辅助注射来创建,因此它能够创建一个。它会将其注入到 
ClassA
 的实例中。在这种情况下,
ClassA
ClassB
实例的
number
都是
1

ClassCFactory cFactory = injector.getInstance(ClassCFactory.class); ClassC c = cFactory.create(3);
如上所述,这会为此新的 

ClassB

 创建新的 
ClassA
ClassC
 实例,每个实例的 
number
3

如果您想解决此问题,您需要更改工厂以采用正确的依赖项并创建这些依赖项

@Assisted

ClassBFactory bFactory = injector.getInstance(ClassBFactory.class); ClassB b = bFactory.create(2); ClassAFactory aFactory = injector.getInstance(ClassAFactory.class); ClassA a = aFactory.create(1, b); // <-- ClassCFactory cFactory = injector.getInstance(ClassCFactory.class); ClassC c = cFactory.create(3, a); // <--
如果您只想拥有这些类中的每一个的一个实例,那么最好在 

Module

 as 
@Provides
 方法中完成,而不是使用辅助注入和工厂:

@Provides ClassA provideClassA(ClassB b) { return new ClassA(1, b); } @Provides ClassB provideClassB() { return new ClassB(2); } @Provides ClassC provideClassC(ClassA a) { return new ClassC(3, a); }
    
© www.soinside.com 2019 - 2024. All rights reserved.