如何根据它提供的界面获得iPojo工厂

时间:2014-12-12 06:07:50

标签: dependency-injection osgi ipojo

如果我想使用方法注入在iPojo中注入服务,我需要做

@Bind
public void bindService(MyService implementation) {
}

根据参数的类型,它知道基于接口注入哪个impl。如果有两个相同接口的impls,它将根据某种算法(服务等级?)

进行选择

现在,如果我需要根据事件需要按需创建的多个服务内容,我理解我应该使用org.apache.felix.ipojo.Factory并通过它构建实例。我遇到的问题是我还没有找到一种方法来指定只使用工厂实例的接口注入哪个工厂

换句话说

@Bind
public void bindService(org.apache.felix.ipojo.Factory myFactory) {
}

含糊不清。我发现注入工厂的唯一方法是使用@Bind(filter="(factory.name=myServiceFactoryImpl)",但这会将消费者与具体的提供商结合起来,这会破坏OSGi服务的全部要点。 我想做的是用简单的英语“将我绑定到其实例实现MyService接口的工厂”。如果同一接口中有许多提供者的工厂,它应该使用与直接注入实例时相同的消歧机制。这可能吗?

2 个答案:

答案 0 :(得分:2)

只需使用component.providedServiceSpecifications属性的过滤器,列出创建的实例公开的接口:

@Requires(filter="(component.providedServiceSpecifications=org.acme.Foo)")
Factory[] factories;

答案 1 :(得分:1)

只需使用MyServiceFactory等工厂界面,使用一种方法MyService create();。 然后编写MyServiceFactory的实现并将其作为OSGi服务发布。然后,客户端可以绑定MyServviceFactory接口并创建其服务实例。