我需要创建具有相同接口的服务组件。这意味着对于同一个接口,我有不同的实现。我试图创建两个具有相同接口的组件,其中一个仅为活动组件。
我使用的是春分声明。你有更好的设计来解决这个问题吗?请在下面找到我的配置。
Component1.xml
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="comp1">
<implementation class="com.demo.impl.CompOneImpl"/>
<service>
<provide interface="com.demo.IComponent"/>
</service>
</scr:component>Component2.xml
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="comp2">
<implementation class="com.demo.impl.CompTwoImpl"/>
<service>
<provide interface="com.demo.IComponent"/>
</service>
</scr:component>从使用者访问组件
消耗组件
comp1.xml
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="consumeComp1">
<implementation class="com.demo.service.ConsumeCompOne"/>
<reference bind="setComp" cardinality="1..1" interface="com.demo.IComponent" name="comp1" policy="static" unbind="unsetComp"/>
</scr:component>comp2.xml
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="consumeComp2">
<implementation class="com.demo.service.ConsumeCompTwo"/>
<reference bind="setComp" cardinality="1..1" interface="com.demo.IComponent" name="comp2" policy="static" unbind="unsetComp"/>
</scr:component>当我试图分别通过comp1和ConsumeCompTwo类访问ConsumeCompOne和comp2时,我总是为两者获得相同的组件,无论是comp1还是comp2。请帮我解决这个问题。
事先谢谢你
爆米花
发布于 2014-11-27 10:03:14
DS工作正常,所以这里没有什么要解决的。
正如您所说的,两个使用者组件都提供了IComponent服务的一个实例,这正是他们作为引用所请求的。
发布于 2014-11-27 10:05:04
如果希望能够选择服务的特定实例,则使用属性发布它以标识它。然后,在客户机上,您可以使用OSGi服务筛选器来选择匹配的过滤器,例如,一个特殊的键/值组合。
发布于 2014-11-27 17:53:42
您希望在target元素上使用reference属性来选择要绑定的特定服务。
comp1.xml
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="consumeComp1">
<implementation class="com.demo.service.ConsumeCompOne"/>
<reference bind="setComp" cardinality="1..1" interface="com.demo.IComponent" name="comp1" policy="static" unbind="unsetComp"
target="(component.name=comp1)"/>
</scr:component>comp2.xml
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="consumeComp2">
<implementation class="com.demo.service.ConsumeCompTwo"/>
<reference bind="setComp" cardinality="1..1" interface="com.demo.IComponent" name="comp2" policy="static" unbind="unsetComp"
target="(component.name=comp2)"/>
</scr:component>https://stackoverflow.com/questions/27166890
复制相似问题