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

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

我的目标是Guice的以下行为:当要求注入器获得A类的新实例时,尝试实例化它; 如果实例化是不可能的,请询问另一个对象(例如ResteasyWebTarget实例)来实例化该类。

我想写一个这样的模块:

 @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为它们使用提供程序,但这是备份方法。

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

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

这是你唯一的选择。 只有当您愿意在整个代码库中传播您的target.proxy ,可选注入才有效。

编辑(2017-02-28) :如果您打算这样做,我已经完成了基础知识,以实现它作为我的magic-provider-guice项目的一部分,以及JDBI和Feign的示例。

实现Injector接口并将该实现用作子注入器

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