Java Guice:注入一个模块,然后安装它

Java Guice:注入一个模块,然后安装它,java,dependency-injection,guice,Java,Dependency Injection,Guice,这有点奇怪。假设您有这样一个模块: public class ParentModule extends AbstractModule { @Override public void configure() { bindConstant().annotatedWith(Names.named("key")).to("key"); } } public class DependentModule extends AbstractModule { pr

这有点奇怪。假设您有这样一个模块:

public class ParentModule extends AbstractModule {
    @Override
    public void configure() {
        bindConstant().annotatedWith(Names.named("key")).to("key");
    }
}
public class DependentModule extends AbstractModule {
    private final String key;

    @Inject public DependentModule(@Named("key") String key) { this.key = key; }

    @Override
    public void configure() {
        // Configure bindings that make use of key...
    }
}

Injector parent = Guice.createInjector(new ParentModule());
Injector child = parent.createChildInjector(parent.getInstance(DependentModule.class));
// Now just ignore parent and work with child exclusively
然后我们也有类似的东西:

public class ParentModule extends AbstractModule {
    @Override
    public void configure() {
        bindConstant().annotatedWith(Names.named("key")).to("key");
    }
}
public class DependentModule extends AbstractModule {
    private final String key;

    @Inject public DependentModule(@Named("key") String key) { this.key = key; }

    @Override
    public void configure() {
        // Configure bindings that make use of key...
    }
}

Injector parent = Guice.createInjector(new ParentModule());
Injector child = parent.createChildInjector(parent.getInstance(DependentModule.class));
// Now just ignore parent and work with child exclusively

这看起来非常麻烦,但在某些情况下可能是必要和有用的(例如,如果密钥是更复杂的数据类型)。无论如何,是否有办法重新构造此代码,以便
ParentModule
绑定密钥,使用密钥创建
DependentModule
,并安装创建的
DependentModule
?也就是说,消费者可以简单地使用一个喷油器,而不必执行这两个喷油器的技巧?

不可能先喷油,然后再安装。注入只有在所有
configure()
方法运行之后才会发生,此时为时已晚。但你可以这样做:

public class MyModule extends AbstractModule {
    @Override
    public void configure() {
        bindConstant().annotatedWith(Names.named("key")).to("key");
    }

    @Provides
    Dependency provideDependency(@Named("key") String key) {
        // Use key here
    }
}

不可能先注入一些东西,然后再安装它。注入只有在所有
configure()
方法运行之后才会发生,此时为时已晚。但你可以这样做:

public class MyModule extends AbstractModule {
    @Override
    public void configure() {
        bindConstant().annotatedWith(Names.named("key")).to("key");
    }

    @Provides
    Dependency provideDependency(@Named("key") String key) {
        // Use key here
    }
}

不可能先注入一些东西,然后再安装它。注入只有在所有
configure()
方法运行之后才会发生,此时为时已晚。但你可以这样做:

public class MyModule extends AbstractModule {
    @Override
    public void configure() {
        bindConstant().annotatedWith(Names.named("key")).to("key");
    }

    @Provides
    Dependency provideDependency(@Named("key") String key) {
        // Use key here
    }
}

不可能先注入一些东西,然后再安装它。注入只有在所有
configure()
方法运行之后才会发生,此时为时已晚。但你可以这样做:

public class MyModule extends AbstractModule {
    @Override
    public void configure() {
        bindConstant().annotatedWith(Names.named("key")).to("key");
    }

    @Provides
    Dependency provideDependency(@Named("key") String key) {
        // Use key here
    }
}

根本不清楚你在问什么。考虑编写一个说明你的代码应该做什么的SCSCE,它根本不清楚你在问什么。考虑编写一个说明你的代码应该做什么的SCSCE,它根本不清楚你在问什么。考虑编写一个说明你的代码应该做什么的SCSCE,它根本不清楚你在问什么。考虑编写一个SSCCE,说明您的代码应该做什么。