我试图创建一个可重用的组件,从居民文件中定义的服务创建ServiceLocator
。我需要确定ServiceLocator
是否具有除内置服务之外的服务。如果它没有,可能会向用户记录一些警告。像
ServiceLocator locator = ServiceLocatorUtilities.createAndPopulateServiceLocator();
List<?> services = locator.getAllServices(BuilderHelper.allFilter());
if (services.isEmpty()) {
LOGGER.log(Level.WARNING,
"No services. Make sure inhabitants generator is working correctly.");
}
这当然不起作用,因为services
仍然包含所有内置服务。我可以创建Filter
之类的
public class NonBuiltInFilter implements Filter {
private static final Set<String> builtInClasses = new HashSet<>(
Arrays.asList("org.jvnet.hk2.internal.ServiceLocatorImpl",
"org.jvnet.hk2.internal.ThreeThirtyResolver",
"org.jvnet.hk2.internal.DynamicConfigurationServiceImpl",
"org.jvnet.hk2.internal.DefaultClassAnalyzer",
"org.jvnet.hk2.internal.ServiceLocatorRuntimeImpl",
"org.jvnet.hk2.internal.InstantiationServiceImpl")
);
@Override
public boolean matches(Descriptor d) {
return !builtInClasses.contains(d.getImplementation());
}
}
...
List<?> services = locator.getAllServices(new NonBuiltInFilter());
这可以现在,但它不是一个很好的解决方案,因为这些类可以随时更改。
所以我只是想知道是否有任何标准方法来检查ServiceLocator
是否有任何服务,除了内置的服务。或者其他一些不像上面Filter
那样脆弱的解决方法。
答案 0 :(得分:1)
在hk2-locator模块的最新版本的hk2中,有一个API可以返回您要查找的过滤器:
这必须在实现模块中,因为另一个实现可能有一组不同的初始服务,因此它不是一般功能。鉴于此,我所知道的hk2没有其他实现,所以它仍然非常普遍!