2015-02-09 78 views
4

我來自guice世界,我正在尋找一種方式來做類似於Guice提供的Modules.override。我有一個模式,我爲我的創作創建了一個基本的Module/AbstractBinder,然後在測試中我重寫了需要更改的綁定。HK2什麼是正確的方式來重寫另一個AbstractBinder的綁定

在理想的世界中,我想簡單地擴展Parent AbstractBinder,然後實現綁定來覆蓋父級活頁夾。或者另一種方法是簡單地安裝父級Binder,然後覆蓋我想要用於測試目的的綁定。

public class IOCRestModule extends AbstractBinder { 

    @Override 
    protected void configure() { 
     // Max timeout for rest calls is 20 seconds, this will come from properties later on. 
     bind(20000).to(Integer.class).named("MAX_REST_REQUEST_TIMEOUT"); 
     bind("tcp://localhost").to(String.class).named("jms.url"); 
    } 
} 

public class IOCMockRestModule extends AbstractBinder { 

    public static final Logger logger = Logger.getLogger(IOCMockRestModule.class.getName()); 

    @Override 
    protected void configure() { 
     install(new IOCRestModule()); 
     bind(200).to(Integer.class).named("MAX_REST_REQUEST_TIMEOUT"); 
     bind("vm://localhost").to(String.class).named("jms.url"); 

} 

這是可能做到的,是否推薦?我注意到當我這樣做時,IOCRestModule的綁定沒有被IOCMockRestModule覆蓋。我假設我可以在最後添加安裝,這可能會工作,但不知道這是否會導致任何問題。

回答

0

在hk2中,您可以爲同一件事物設置多個綁定。默認情況下,最早的會優先,但您可以使用排名來更改。因此,我認爲下面的代碼將改變周圍的順序:

@Override 
protected void configure() { 
    install(new IOCRestModule()); 
    bind(200).to(Integer.class).named("MAX_REST_REQUEST_TIMEOUT").ranked(10); 
    bind("vm://localhost").to(String.class).named("jms.url").ranked(10); 
} 

這基本上給出了這樣的結合不是從IOCRestModule一個較高的排名,並隨後將在注入點第一次使用。你應該注意的是,如果有人找整數與名稱MAX_REST_REQUEST_TIMEOUT名單,他們將得到他們兩個

+0

也正在安裝後您的其他綁定會因爲最老的綁定選擇規則的工作,如果他們有同等級別 – jwells131313 2015-02-10 12:46:09

相關問題