跳到主要内容

injecting-instances

从'@site/src/components/GithubLink'导入Githublink。

注入实例

在本教程中,我们将把实例注入类中。 我们将使用2种方法。

  • 使用一个
    实例注入器"。
  • 添加将其字段注入到绑定图的类

模块#

我们将定义两个独立的模块:一个将提供 String message,另一个将提供 int id。

public class MessageModule extends AbstractModule {    @Provides    String message() {        return "hello";    }}
public class IdModule extends AbstractModule {    @Provides    int id() {        return 123;    }}

使用一个 InstanceInjector#

这里是需要注入其字段的类。

public class Injected {    @Inject    String value;
    @Inject    int id;}

我们需要创建一个 Injector ,并将 MessageModuleIdModule 作为参数传递。

我们还需要为一个实例注入器添加一个绑定。 为此,我们将使用 ModuleBuilder ,手动构建第三个模块,其唯一目的是绑定一个实例注入器。

Injector injector = Injector.of(        new MessageModule(),        new IdModule(),        ModuleBuilder.create()                .bindInstanceInjector( Injected.class)                .build())。

最后,我们需要从Injector获得 InstanceInjector ,并使用它将字段注入到新创建的 Injected 实例中。

InstanceInjector<Injected> instanceInjector = injector.getInstanceInjector(Injected.class);
Injected injected = new Injected();instanceInjector.injectInto(injected);

将类添加到绑定图中#

这里又是一个需要注入其字段的类。 注意,这次有一个 @Inject 注释,注解了类型。

@Injectpublic class Injected {    @Inject    String value;
    @Inject    int id;}

或者,你可以添加一个构造函数,并用 @Inject 注释来说明,像这样。

public class Injected {    private final String value;    private final int id;
    @Inject    public Injected(String value, int id) {        this.value = value;        this.id = id;    }    //...}

我们仍然需要创建一个 Injector ,并将 MessageModuleIdModule 作为参数传递。

然而,这次我们不是绑定实例注入器,而是绑定 Injected 类。 为此,我们还将使用 ModuleBuilder ,手动构建第三个模块,其唯一目的是绑定一个需要的类。

Injector injector = Injector.of(        new MessageModule(),        new IdModule(),        ModuleBuilder.create()                .bind(Injected.class)                .build()) 。

最后,我们可以向注射器请求一个 Injected 的实例。 所有的字段都被正确地注入了。

Injected instance = injector.getInstance(Injected.class)。