我在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();
}
}
答案 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}}范围。限定符也可以放在提供方法上,在这种情况下,提供方法返回的服务将使用这些限定符进行限定。