[英]How to delegate creation of some classes from Guice injector to another factory?
例如,RESTEasy的ResteasyWebTarget類有一個方法proxy(Class<T> clazz)
,就像Injector的getInstance(Class<T> 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不支持這個,它也沒有讓你聽的鈎子。 如果找不到綁定,則不會調用它提供的鈎子( ProvisionListener
和TypeListener
)。
我可以編寫一個方法來枚舉某些包中的所有帶注釋的接口,並告訴Guice使用提供程序,但這是備份方法。
這是你唯一的選擇。 只有當您願意在整個代碼庫中傳播您的target.proxy
,可選注入才有效。
編輯(2017-02-28) :如果你要這樣做,我已經完成了基礎知識,以實現它作為我的magic-provider-guice項目的一部分,以及JDBI和Feign的示例。
實現Injector接口並將該實現用作子注入器
我不相信你可以設置一個子注入器(只需讓Guice用一組模塊創建一個),所以這也行不通。
https://github.com/google/guice/wiki/Injections檢查可選注射,你可以創建一個后退。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.