簡體   English   中英

如何將一些類的創建從Guice注入器委托給另一個工廠?

[英]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不支持這個,它也沒有讓你聽的鈎子。 如果找不到綁定,則不會調用它提供的鈎子( ProvisionListenerTypeListener )。

我可以編寫一個方法來枚舉某些包中的所有帶注釋的接口,並告訴Guice使用提供程序,但這是備份方法。

這是你唯一的選擇。 只有當您願意在整個代碼庫中傳播您的target.proxy ,可選注入才有效。

編輯(2017-02-28) :如果你要這樣做,我已經完成了基礎知識,以實現它作為我的magic-provider-guice項目的一部分,以及JDBIFeign的示例。

實現Injector接口並將該實現用作子注入器

我不相信你可以設置一個子注入器(只需讓Guice用一組模塊創建一個),所以這也行不通。

https://github.com/google/guice/wiki/Injections檢查可選注射,你可以創建一個后退。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM