Guice:注入模块然后安装它

时间:2014-12-16 22:55:03

标签: 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 {
    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?也就是说,消费者可以简单地使用单个注射器而不必进行这种双注射器技巧?

1 个答案:

答案 0 :(得分:3)

无法注入某些东西然后安装它。注入仅在所有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
    }
}