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

HK2 Inhabitant Generator: How to bind a factory to an annotated service?

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

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

register(new AbstractBinder() {

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

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

如何通过注解绑定工厂(根本不使用编程绑定器?

如果 HK2 做不到:如何为需要工厂的 class 使用 AbstractBinder,并为所有其他使用居民文件?

更新: 我的工厂是这样的:

public class ClientManagerFactory implements Factory<ClientManager> {

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

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

}

一个Factory是一个service,稍微有点特殊,因为factory的provide方法也是一个service,所以一个Factoryclass产生两个hk2服务。这意味着工厂本身可以注入其他服务。但这也意味着,当使用自动服务发现(hk2-metadata-generator 或 hk2-inhabitant-genertor)时,您需要使用 @Service.

对其进行注释

注意Factory的作用域和provide方法的作用域可以不同。事实上,如果你在 provide 方法中留下任何范围注释,默认情况下,它会在 PerLookup scope. I have modified your code from above to make it a Factory where both the Factory and the provide method service are in the 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 范围内。限定符也可以放在 provide 方法上,在这种情况下,provide 方法返回的服务将使用这些限定符进行限定。