我需要创建具有相同接口的服务组件。这意味着我有相同的接口不同的实现。我尝试创建两个具有相同接口的组件,其中一个只有一个活动。
我正在使用equinox声明。你有更好的设计来解决这个问题吗?请在下面找到我的配置。
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>
当我尝试通过ConsumeCompOne和ConsumeCompTwo类分别访问comp1和comp2时,我总是为comp1或comp2获得相同的组件。请帮我解决这个问题。
提前谢谢
gopy
答案 0 :(得分:1)
DS工作正常,所以这里无需解决。
正如您所说,两个消费者组件都提供了IComponent
服务的实例,这正是他们作为参考请求的。
答案 1 :(得分:1)
如果您希望能够选择服务的特定实例,则使用属性发布它以识别它。然后,在客户端上,您可以使用OSGi服务过滤器来选择与之匹配的过滤器。一个特殊的键/值组合。
答案 2 :(得分:1)
您希望使用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>