HK2覆盖另一个AbstractBinder绑定的正确方法是什么

Chr*_*haw 5 jersey-2.0 hk2

我来自guice世界,正在寻找一种类似于Guice提供的Modules.override的方法.我有一个模式,我为我的生产创建一个基本模块/ 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");

}
Run Code Online (Sandbox Code Playgroud)

这可能吗,推荐吗?我注意到,当我这样做时,IOCRestModule的绑定没有被IOCMockRestModule覆盖.我假设我可以在最后添加安装,这可能会工作但不确定这是否会导致以后出现任何问题.

jwe*_*313 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);
}
Run Code Online (Sandbox Code Playgroud)

这实质上赋予了该绑定比 IOCRestModule 中的绑定更高的级别,然后将首先在注入点中使用该绑定。您应该注意,如果有人查找名称为 MAX_REST_REQUEST_TIMEOUT 的整数列表,他们将得到其中两个