ServiceLocator如何在HK2中自动找到@Service和@Contact?

时间:2014-05-01 06:00:00

标签: java jersey hk2

根据HK2 @Service javadoc

  

自动添加到的类上的注释   hk2 ServiceLocator。

我不知道如何让ServiceLocator自动查找带注释的类。

TestService的

@Contract
public interface TestService {

}

TestServiceImpl

@Service
public class TestServiceImpl implements TestService {

}

主要

public static void main(String[] args) {
    ServiceLocator locator = ServiceLocatorUtilities.createAndPopulateServiceLocator();

    TestService service = locator.getService(TestServiceImpl.class);    
    System.out.println(service); // null
}

结果始终为null。我必须添加Descriptor,以便ServiceLocator可以找到它。

public static void main(String[] args) {
    ServiceLocator locator = ServiceLocatorUtilities.createAndPopulateServiceLocator();

    DynamicConfigurationService dcs = locator.getService(DynamicConfigurationService.class);
    DynamicConfiguration config = dcs.createDynamicConfiguration();
    config.bind(BuilderHelper.link(TestServiceImpl.class).to(TestService.class).in(Singleton.class).build());
    config.commit();

    TestService service = locator.getService(TestServiceImpl.class);    
    System.out.println(service); // TestServiceImpl instance
}

如何让ServiceLocator自动查找带注释的类?我误解了什么吗?

3 个答案:

答案 0 :(得分:5)

您需要在构建的类上运行hk2-inhabitant-generator才能自动检测服务。还有更多信息here

该步骤在构建过程中的作用是创建一个名为META-INF / hk2-locator / default的文件,其中包含有关服务的信息。然后,createAndPopulateServiceLocator调用将读取这些文件,并自动将这些服务描述符添加到返回的ServiceLocator中。

答案 1 :(得分:5)

仅供参考,我对依赖于居民文件感到非常沮丧,而不是具有运行时扫描注释类的能力,我写了这个项目:

https://github.com/VA-CTT/HK2Utilities

由于Eclipse / Maven /居民运行时生成器不能很好地运行,因此几乎不可能在没有运行时扫描的情况下调试在eclipse中使用HK2的代码。

HK2Utilities套餐位于中央:

<dependency>
    <groupId>gov.va.oia</groupId>
    <artifactId>HK2Utilities</artifactId>
    <version>1.4.1</version>
</dependency>

要使用它,您只需致电:

ServiceLocator locator = HK2RuntimeInitializer.init("myName", false, new String[]{"my.package.one", "my.package.two"});

这将扫描运行时类路径中列出的包中的类,并自动使用它们填充服务定位器。

您不必使用此模型生成居民文件 - 在实践中,我发现它的表现也比居民处理代码更快(并非性能对此次一次性操作非常重要)< / p>

--- ---编辑

我仍然维护这段代码 - 目前的版本是:

<dependency>
    <groupId>net.sagebits</groupId>
    <artifactId>HK2Utilities</artifactId>
    <version>1.5.2</version>
</dependency>

项目位置现在是: https://github.com/darmbrust/HK2Utilities

答案 2 :(得分:0)

现在(2.6.1),您需要做的就是添加依赖项-javax.inject,hk2-utils,hk2-api和hk2-metadata-generator。

在构建项目时,javac编译器将在META-INF中生成一个“默认”文件,其中包含以下内容:

[service-class-name]S
contract={contract-class-name}

这将在运行期间由ServiceLocator注册。 这应该足够了。但是,如果那行不通,还有其他选择,

  • mvn插件

      org.glassfish.hk2   hk2-居民发电机   2.5.0-b36                        产生居民               

  • cmd线工具

    java org.jvnet.hk2.generator.HabitatGenerator   [-文件jarFileOrDirectory]   [--outjar jarFile]   [--locator locatorName]   [--verbose]

有关此https://javaee.github.io/hk2/inhabitant-generator.html

的更多信息