确定ServiceLocator没有用户定义的服务

时间:2015-12-23 10:21:50

标签: java hk2

我试图创建一个可重用的组件,从居民文件中定义的服务创建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那样脆弱的解决方法。

1 个答案:

答案 0 :(得分:1)

在hk2-locator模块的最新版本的hk2中,有一个API可以返回您要查找的过滤器:

Hk2LocatorUtilities

这必须在实现模块中,因为另一个实现可能有一组不同的初始服务,因此它不是一般功能。鉴于此,我所知道的hk2没有其他实现,所以它仍然非常普遍!