Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Spring通过id获得osgi服务?_Java_Spring_Osgi_Spring Dm - Fatal编程技术网

Java 如何使用Spring通过id获得osgi服务?

Java 如何使用Spring通过id获得osgi服务?,java,spring,osgi,spring-dm,Java,Spring,Osgi,Spring Dm,这里是春天 我的一个捆绑包中定义了一个osgi服务,如下所示: <osgi:service id="myModelInterpreter" ref="myModelInterpreterService" interface="*.IModelInterpreter" /> 我知道我可以通过doinggetServiceReference(向下传递imodeinterpreter.class.getName)然后通过getService从另一个包访问它 有没有办法通过id(MyM

这里是春天

我的一个捆绑包中定义了一个osgi服务,如下所示:

<osgi:service id="myModelInterpreter" ref="myModelInterpreterService" interface="*.IModelInterpreter" />

我知道我可以通过doing
getServiceReference
(向下传递
imodeinterpreter.class.getName
)然后通过
getService
从另一个包访问它

有没有办法通过id(MyModel解释器)而不是使用接口(作为
imodeinterpreter.class.getName
传递到
getServiceReference
)来获取服务

非常感谢您的帮助。

或直接使用

Object obj = beanFactory.createBean(YourClass.class);
或者只是使用

Object obj = beanFactory.createBean(YourClass.class);

因为您已经在使用SpringDM来声明您的服务,所以使用它的最简单方法是使用另一个DM配置

<osgi:reference id="modelInterpreter" interface="IModelInterpreter" />

这也可以这样表示,以过滤到特定的Springbean

<osgi:reference id="modelInterpreter" bean-name="myModelInterpreter" interface="IModelInterpreter" />

然后,您只需使用bean“消费者捆绑包中的常规Spring配置中的Model解释器。这一行也可以使用bean名称来完成,但我非常确定它仍然需要interface或interfaces属性,因为这是唯一可以接受的查找OSGi服务的方法。使用bean名称只是简单地为服务查找上的属性过滤器的使用加上糖衣,这在大多数情况下是不需要的,因为它实际上在bundle之间创建了更紧密的依赖关系。例如,在没有这种紧密耦合的情况下模拟依赖关系更容易

另一方面,如果您希望在不使用DM的情况下访问该服务,那么我建议您使用直接访问(通过代码)注册表或使用DS(声明性服务)注入它的直接OSGi方式


我不会使用常规Spring直接访问OSGi服务。仅在捆绑包内使用Spring进行配置,并使用Spring DM外部化捆绑包间的依赖关系。

由于您已经在使用Spring DM声明您的服务,使用它的最简单方法是使用另一个DM配置

<osgi:reference id="modelInterpreter" interface="IModelInterpreter" />

这也可以这样表示,以过滤到特定的Springbean

<osgi:reference id="modelInterpreter" bean-name="myModelInterpreter" interface="IModelInterpreter" />

然后,您只需使用bean“消费者捆绑包中的常规Spring配置中的Model解释器。这一行也可以使用bean名称来完成,但我非常确定它仍然需要interface或interfaces属性,因为这是唯一可以接受的查找OSGi服务的方法。使用bean名称只是简单地为服务查找上的属性过滤器的使用加上糖衣,这在大多数情况下是不需要的,因为它实际上在bundle之间创建了更紧密的依赖关系。例如,在没有这种紧密耦合的情况下模拟依赖关系更容易

另一方面,如果您希望在不使用DM的情况下访问该服务,那么我建议您使用直接访问(通过代码)注册表或使用DS(声明性服务)注入它的直接OSGi方式


我不会使用常规Spring直接访问OSGi服务。使用Spring仅在包内进行配置,并使用Spring DM外部化包间依赖关系。

我认为您无法通过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)"/>

我认为您无法通过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)"/>


您自己尝试实例化bean的原因是什么。“实例化一个对象”您的意思是它将是一个Springbean实例吗?该类(其名称为String para)是否由Spring管理?@Kent是的,该类由Spring管理,它不在我的构建路径中,因为它是作为可发现的osgi服务公开的,因此我无法使用reflection不确定它是否可以工作,但也许您可以尝试执行
class.forName(String className)
并使用该调用的结果调用
AutowireCapableBeanFactory.createBean
。重新标记以包含osgi,据我目前的理解,您需要能够在运行时在spring容器中包含osgi管理的bean。您自己实例化bean的原因是什么。“实例化对象”你的意思是它将是一个Springbean实例吗?该类(其名称为String para)是否由Spring管理?@Kent是的,该类由Spring管理,它不在我的构建路径中,因为它是作为可发现的osgi服务公开的,因此我无法使用reflection不确定它是否可以工作,但也许您可以尝试执行
class.forName(String className)
并使用该调用的结果调用
AutowireCapableBeanFactory.createBean
。重新标记以包含osgi,据我目前的理解,您需要能够在运行时在spring容器中包含osgi管理的bean。感谢您的回答。我的问题是,我需要根据一个永久的配置值(id)来“查找”服务,这样我就不能声明性地放下对给定服务的引用。我基本上需要从配置文件中读取一组服务ID,并获取与这些ID对应的所有服务,运行它们并调用通用方法。我不知道有多少个——例如,我有多个实现IModelInterpreter的服务,这就是为什么我需要通过某种id来查找它们(我选择了服务定义的id)。您可以在注册服务时使用id作为属性,并在查找服务引用时对该属性进行筛选。斯普林