有多种方法可以以声明方式注册和使用服务。您可以使用声明式服务 (DS) http://wiki.osgi.org/wiki/Declarative_Services or 蓝图服务 http://www.ibm.com/developerworks/opensource/library/os-osgiblueprint/。还有其他的,但这些是实际规范的一部分。
至于您目前使用的程序化方法。注册时必须使用属性,创建跟踪器时必须使用过滤器。
Map<String, String. prop1 = new HashMap<String, String>();
prop1.put("name", "primary");
context.registerService(IService.class.getName(), new ServiceImpl1(), prop1);
Map<String, String. prop2 = new HashMap<String, String>();
prop1.put("name", "secondary");
context.registerService(IService.class.getName(), new ServiceImpl2(), props);
现在进行查找。
ServiceTracker primaryTracker = new ServiceTracker(bundleContext, "(&(objectClass=my.service.Service)(name=primary))", null);
ServiceTracker secondaryTracker = new ServiceTracker(bundleContext, "(&(objectClass=my.service.Service)(name=secondary))", null);
(更新了排名 - 感谢尼尔)如果没有过滤器,您将根据排名和服务 ID 获取服务。如果您在动态环境中运行(这些服务正在停止并重新启动),那么每次查找服务时都可能获得不同的实现。