如果我想使用方法注入在 iPojo 中注入服务,我需要做
@Bind
public void bindService(MyService implementation) {
}
根据参数的类型,它仅根据接口知道要注入哪个 impl。如果同一接口有两个 impl,它将根据某种算法(服务等级?
现在,如果我需要基于事件按需创建的服务的多个意图,我知道我应该使用 org.apache.felix.ipojo.Factory 并通过它构建实例。我遇到的问题是我没有找到一种方法来指定仅使用工厂实例的接口注入哪个工厂
换句话说,
@Bind
public void bindService(org.apache.felix.ipojo.Factory myFactory) {
}
是模棱两可的。我发现注入工厂的唯一方法是使用@Bind(filter="(factory.name=myServiceFactoryImpl)"
但这会将消费者与具体的提供者耦合,这违背了OSGi服务的全部意义。我想做的是用简单的英语"将我绑定到其实例实现接口 MyService 的工厂"。如果同一接口上再次有许多提供程序的工厂,则应使用与直接注入实例时相同的消除歧义机制。这可能吗?
只需使用 component.providedServiceSpecifications
属性使用筛选器,列出创建的实例公开的接口:
@Requires(filter="(component.providedServiceSpecifications=org.acme.Foo)")
Factory[] factories;
只需使用像MyServiceFactory
这样的工厂接口,只需使用一种方法MyService create();
。然后编写 MyServiceFactory 的实现并将其发布为 OSGi 服务。然后,客户端可以绑定 MyServviceFactory 接口并创建其服务实例。