HK2居民生成器:如何将工厂绑定到带注释的服务?

时间:2016-01-29 13:13:00

标签: java maven glassfish jersey-2.0 hk2

我在Jersey应用程序中使用HK2。要绑定类,我使用的是居民生成器maven插件。

对于我的一个类,我需要使用工厂来生成实例。在我的应用程序类中绑定工厂按预期工作:

register(new AbstractBinder() {

    @Override
    protected void configure() {
        bindFactory(ClientManagerFactory.class).to(ClientManager.class);
    }
});

问题是,一旦我注册抽象活页夹,我的居民文件就会被忽略。

如何通过注释绑定工厂(根本不使用程序化绑定器?

如果HK2无法做到这一点:如何对需要工厂的课程使用AbstractBinder,并为所有其他人使用居民文件?

更新: 我的工厂看起来像这样:

public class ClientManagerFactory implements Factory<ClientManager> {

    @Override
    public ClientManager provide() {
        return ClientManager.fromSettings();
    }

    @Override
    public void dispose(ClientManager instance) {
        instance.cleanupResources();
    }

}

1 个答案:

答案 0 :(得分:3)

工厂是一项服务,稍微有些特殊,因为工厂的提供方法也是服务,因此一个工厂类产生两个hk2服务。这意味着工厂本身可以注入其他服务。但这也意味着,当使用自动服务发现(hk2-metadata-generator或hk2-inhabitant-genertor)时,您需要使用@Service对其进行注释。

请注意,Factory的范围和提供方法的范围可以不同。实际上,如果您将任何范围注释保留在提供方法之外,则默认情况下它将位于PerLookup范围内。我已经修改了上面的代码,使其成为工厂,其中Factory和提供方法服务都在Singleton范围内:

@Service
public class ClientManagerFactory implements Factory<ClientManager> {

    @Override @Singleton
    public ClientManager provide() {
        return ClientManager.fromSettings();
    }

    @Override
    public void dispose(ClientManager instance) {
        instance.cleanupResources();
    }

}

作为旁注,当您使用@Service时,默认范围变为Singleton,这就是为什么提供方法(其上不能有@Service)默认为PerLookup 3}}范围。限定符也可以放在提供方法上,在这种情况下,提供方法返回的服务将使用这些限定符进行限定。