7

根据 HK2 @Service javadoc

放置在要自动添加到 hk2 ServiceLocator 的类上的注释。

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

测试服务

@Contract
public interface TestService {

}

测试服务实现

@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自动查找带注释的类?我是不是误会了什么?

4

3 回答 3

5

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

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

于 2014-05-01T12:37:50.223 回答
5

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

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

由于 Eclipse / Maven / inhabitant 运行时生成器不能很好地运行,因此几乎不可能在没有运行时扫描的情况下调试在 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"});

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

您不必使用此模型生成驻留文件 - 在实践中,我发现它的执行速度也比驻留处理代码更快(并不是说性能对于这个一次性操作很重要)

- -编辑 - -

我仍然维护此代码 - 当前版本是:

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

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

于 2016-02-04T03:05:42.637 回答
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-inhabitant-generator 2.5.0-b36 generate-inhabitants

  • 命令行工具

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

更多关于这个https://javaee.github.io/hk2/inhabitant-generator.html

于 2019-09-17T13:10:51.300 回答