如何将一些 类 的创建从 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 用一组模块创建一个),所以这也行不通。
例如,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 用一组模块创建一个),所以这也行不通。