根据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
自动查找带注释的类?我误解了什么吗?
答案 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>
答案 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]