如何用Guice创建隐式通用绑定?

时间:2014-08-02 16:30:01

标签: java generics binding guice implicit

这是我的问题,我有一个Client接口,它有一个<T> Prop<T> getProp(Class<T>)方法。可以使用PropKey构建PropKey.of(Class)

我在像Client这样的模块中注入bind(Client.class).to(ClientImpl.class).in(Scopes.SINGLETON);的实例,我希望能够像这样注入Prop

public class MyService implements Service {
    @Inject Client client;
    @Inject Prop<User> user;
}

如何告诉Guice注射Prop<User>会导致client.getProp(User.class)。我主要是通过SPI搜索了如何做到这一点,但我没有找到任何方法来获得未知的绑定。我还回顾了Jukito,这是一个使用SPI的质量项目。

1 个答案:

答案 0 :(得分:3)

除非Prop<T>本身是一个可注射的具体类,否则没有办法让Guice绑定T所有类型Prop。在那种情况下,它只会工作。&#34;

但是如果类型集T很小,你可以明确地绑定到提供者:

class PropProvider<T> implements Provider<Prop<T>> {
    private final Class<T> type;
    @Inject Client client;

    PropProvider(Class<T> type) {
        this.type = type;
    }

    @Override
    public void get() {
        return client.getProp(type);
    }
}

class MyModule extends AbstractModule {
    @override
    protected void configure() {
        bind(new TypeLiteral<Prop<User>>() { })
                .toProvider(new PropProvider(User.class));
        // More similar statments...
    }
}

或者,您可以使用custom injections来编写类似

的内容
class MyService implements Service {
    @Inject Client client;
    @InjectProp Prop<User> user;
}

但您需要使用自定义注释。