春天的菜鸟。
我的一个osgi服务在我的一个bundle中定义如下:
<osgi:service id="myModelInterpreter" ref="myModelInterpreterService" interface="*.IModelInterpreter" />
我知道我可以通过BundleContext
getServiceReference
{传递IModelInterpreter.class.getName
)然后getService
从另一个捆绑中访问它。
有没有办法通过id(myModelInterpreter)而不是使用接口(以IModelInterpreter.class.getName
传递给getServiceReference
)来获取服务?
任何帮助表示感谢。
答案 0 :(得分:2)
我认为你不能通过你在spring配置中指定的id获得服务,因为它是spring上下文的内部设置。您可以做的是为服务添加一些服务属性并对其进行过滤。
像这样:
<service ref="myModelInterpreterService" interface="*.IModelInterpreter">
<service-properties>
<beans:entry key="myId" value="myModelInterpreter"/>
</service-properties>
</service>
然后在另一个包中,您可以过滤属性:
<reference id="myModelInterpreterService" interface="com.xyz.IModelInterpreter"
filter="(myId=myModelInterpreter)"/>
答案 1 :(得分:1)
由于您已经在使用Spring DM来声明您的服务,因此使用它的最简单方法是对另一个dm配置执行相同的操作。
<osgi:reference id="modelInterpreter" interface="IModelInterpreter" />
这也可以像这样表示过滤到特定的Spring bean。
<osgi:reference id="modelInterpreter" bean-name="myModelInterpreter" interface="IModelInterpreter" />
然后你只需在使用者服务器包中的常规Spring配置中使用bean“modelInterpreter。同样的行也可以使用bean-name来完成,但我很确定它仍然需要interface或interfaces属性,因为这些是查找OSGi服务的唯一可接受的方法。使用bean-name简单地在服务查找中使用属性过滤器,在大多数情况下你不需要,因为它实际上在bundle之间创建了更紧密的依赖例如,如果没有这种紧密耦合,就可以更容易地模拟你的依赖。
另一方面,如果您希望在不使用DM的情况下访问服务,那么我建议您使用直接访问OSGi方式(通过代码)直接访问注册表或使用DS注入它(声明服务)。
我会远离使用常规Spring来直接访问OSGi服务。使用Spring仅在bundle中进行配置,并使用Spring DM外部化interbundle依赖项。
答案 2 :(得分:-2)
或者只是使用
Object obj = beanFactory.createBean(YourClass.class);