如何将一些 类 的创建从 Guice 注入器委托给另一个工厂?

How to delegate creation of some classes from Guice injector to another factory?

例如,RESTEasy 的 ResteasyWebTarget class 有一个方法 proxy(Class<T> clazz),就像 Injector 的 getInstance(Class<T> clazz)。有没有办法告诉 Guice 一些 classes 的创建应该委托给某个实例?

我的目标是 Guice 的以下行为:当注入器被要求提供 class A 的新实例时,尝试实例化它;如果实例化是不可能的,请求另一个对象(例如 ResteasyWebTarget 实例)来实例化 class.

我想写一个这样的模块:

@Override
protected void configure() {
    String apiUrl = "https://api.example.com";
    Client client = new ResteasyClientBuilder().build();
    target = (ResteasyWebTarget) client.target(apiUrl);

    onFailureToInstantiateClass(Matchers.annotatedWith(@Path.class)).delegateTo(target);
}

而不是

@Override
protected void configure() {
    String apiUrl = "https://api.example.com";
    Client client = new ResteasyClientBuilder().build();
    target = (ResteasyWebTarget) client.target(apiUrl);

    bind(Service1.class).toProvider(() -> target.proxy(Service1.class);
    bind(Service2.class).toProvider(() -> target.proxy(Service2.class);
    bind(Service3.class).toProvider(() -> target.proxy(Service3.class);
}

我考虑过实现 Injector 接口并将该实现用作子注入器,但该接口的方法太多。

可以编写一个方法来枚举某个包中所有带注释的接口并告诉 Guice 为它们使用提供程序,但这是备用方法。

https://github.com/google/guice/wiki/Injections 查看 Optional Injections,你可以用它创建后备。

Guice不支持这个,它也没有钩子让你听。如果找不到绑定,它提供的挂钩 (ProvisionListener & TypeListener) 不会被调用。

I can write a method enumerating all annotated interfaces in some package and telling Guice to use provider for them, but that's the backup approach.

这是你唯一的选择。可选注入仅在您愿意将您的 target.proxy 爱传播到整个代码库时才有效。

编辑 (2017-02-28):如果你要这样做,我已经完成了基础知识以使其成为我 [=15] 的一部分=].

implementing Injector interface and use that implementation as a child injector

我不相信你可以设置一个子注入器(只要让 Guice 用一组模块创建一个),所以这也行不通。