【问题标题】:HK2 Inhabitant Generator: How to bind a factory to an annotated service?HK2 Inhabitant Generator:如何将工厂绑定到带注释的服务?
【发布时间】:2016-01-29 13:12:59
【问题描述】:

我在我的 Jersey 应用程序中使用 HK2。要绑定类,我使用的是 inhabitant generator 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();
    }

}

【问题讨论】:

  • 如果没有工厂,您目前如何让从居民文件创建的 ServiceLocator 与 Jersey 一起工作?
  • 我也想看看你的工厂代码,特别是你在提供方法上放了什么注释。我们有很多测试表明工厂可以与 hk2-inhabitant-generator 一起使用
  • @jwells131313 我在原始帖子中添加了工厂代码。我没有任何注释 - 我必须添加任何注释吗?

标签: java maven glassfish jersey-2.0 hk2


【解决方案1】:

一个Factory是一个服务,有点特别,因为工厂的provide方法也是一个服务,所以一个Factory类产生两个hk2服务。这意味着工厂本身可以注入其他服务。但这也意味着,在使用自动服务发现(hk2-metadata-generator 或 hk2-inhabitant-genertor)时,您需要使用@Service 对其进行注释。

请注意,Factory 的范围和提供方法的范围可以不同。事实上,如果您将任何范围注释从提供方法中保留下来,默认情况下,它将位于 PerLookup 范围内。我已经从上面修改了您的代码,使其成为工厂,其中工厂和提供方法服务都在 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 范围内。限定符也可以放在提供方法上,在这种情况下,提供方法返回的服务将使用这些限定符进行限定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多