Dependency injection 如何根据iPojo工厂提供的接口获取iPojo工厂

Dependency injection 如何根据iPojo工厂提供的接口获取iPojo工厂,dependency-injection,osgi,ipojo,Dependency Injection,Osgi,Ipojo,如果我想使用方法注入在iPojo中注入服务,我需要这样做 @Bind public void bindService(MyService implementation) { } 根据参数的类型,它知道只根据接口注入哪个impl。如果同一接口有两个IMPL,它将根据某种算法(服务等级?) 现在,如果我需要基于事件按需创建多个服务实例,我知道我应该使用org.apache.felix.ipojo.Factory并通过它构建实例。我遇到的问题是,我没有找到一种方法,仅使用工厂实例的接口来指定要注入的

如果我想使用方法注入在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=myservicecfactorympl)”
,但这将消费者与一个具体的提供者结合起来,这破坏了OSGi服务的全部意义。我想做的是用简单的英语“将我绑定到一个实例实现接口MyService的工厂”。如果同一接口又有许多提供者的工厂,它应该使用与直接注入实例时相同的消歧机制。这可能吗?

只需使用工厂接口,如
myservicecfactory
和一个方法
myservicecreate();

然后编写MyServiceFactory的实现并将其发布为OSGi服务。然后,客户端可以绑定MyServiceFactory接口并创建其服务实例。

只需使用工厂接口,如
MyServiceFactory
和一个方法
MyServiceCreate();

然后编写MyServiceFactory的实现并将其发布为OSGi服务。然后,客户端可以绑定MyServiceFactory接口并创建其服务实例。

只需使用工厂接口,如
MyServiceFactory
和一个方法
MyServiceCreate();

然后编写MyServiceFactory的实现并将其发布为OSGi服务。然后,客户端可以绑定MyServiceFactory接口并创建其服务实例。

只需使用工厂接口,如
MyServiceFactory
和一个方法
MyServiceCreate();

然后编写MyServiceFactory的实现,并将其发布为OSGi服务。然后,客户端可以绑定MyServiceFactory接口并创建其服务实例。

只需使用使用
组件的筛选器。providedServiceSpecifications
属性列出所创建实例公开的接口:

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

只需使用
组件的过滤器。providedServiceSpecifications
属性列出所创建实例公开的接口:

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

只需使用
组件的过滤器。providedServiceSpecifications
属性列出所创建实例公开的接口:

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

只需使用
组件的过滤器。providedServiceSpecifications
属性列出所创建实例公开的接口:

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

是的,这是可行的,但问题是,
org.apache.felix.ipojo.Factory
?因为我想象它不仅仅是创建实例。它还控制实例的生命周期,就像你说的,ipojo工厂接口允许做的不仅仅是创建实例。我不会在外部使用它但是你的捆绑包。这会暴露出你使用ipojo的事实。我宁愿隐藏这一点,这样你的服务使用者只暴露在标准java中,这会导致更低的耦合。我很高兴你提到这一点。这是我对ipojo.Factory最大的抱怨之一。但是,如果我实现自己的工厂,那么我就失去了整个生命周期ipojo的le管理。一个具体的例子,如果工厂服务消失,创建实例的持有者会做什么?通常,服务的使用者不应该持有服务引用更长的时间。如果这样做,那么在移除提供程序包的情况下,类将无法清理。因此,作为使用者,您应该监控当工厂离开时,工厂服务和清理您对实例的引用。对于直接服务引用,您也需要做同样的工作。是的,这会起作用,但问题是,
org.apache.felix.ipojo.factory
?因为我想它不仅仅是创建实例。它还可以控制it’它的实例的生命周期就像你说的ipojo工厂接口允许做的不仅仅是创建实例。但是我不会在你的捆绑包之外使用它。它会暴露你使用ipojo的事实。我宁愿隐藏这一点,这样你的服务的消费者只暴露于标准java,这会降低耦合。我很高兴你这么说提到这一点。这是我对ipojo.Factory最大的抱怨之一。但是,如果我实现自己的工厂,那么我就失去了ipojo的整个生命周期管理。一个具体的例子,如果工厂服务消失,创建实例的持有者会做什么?通常服务的消费者不应该持有服务引用保留较长时间。如果这样做,则在删除提供程序捆绑包的情况下,无法清理类。因此,作为使用者,您应该监视工厂服务,并在工厂消失时清理对实例的引用。对于直接服务引用,您也需要执行相同的操作。是的,这会起作用,但问题是,w
org.apache.felix.ipojo.Factory
的重点是什么?因为我认为它不仅仅是创建实例。它还控制实例的生命周期,就像你说的ipojo Factory接口允许做的不仅仅是创建实例。不过,我不会在包之外使用它。它会暴露这样一个事实:您使用的是ipojo,我宁愿将其隐藏起来,这样您的服务的使用者就只能使用标准java