如何在OSGi中编写工厂模式?

如何在OSGi中编写工厂模式?,osgi,service-factory,Osgi,Service Factory,我有多个实现相同服务的Impl类。我需要在osgi中编写一个工厂类,在这里我应该编写getter方法来返回适当的Impl对象。下面是我试过的代码。我在工厂班上很受感动。有什么想法可以继续吗 public interface ServiceA { public void display(); } @Component (description = "Test1 service", ds = true, immediate = true) @Service (value = {Service

我有多个实现相同服务的Impl类。我需要在osgi中编写一个工厂类,在这里我应该编写getter方法来返回适当的Impl对象。下面是我试过的代码。我在工厂班上很受感动。有什么想法可以继续吗

public interface ServiceA {
   public void display();
}

@Component (description = "Test1 service", ds = true, immediate = true)
@Service (value = {ServiceA.class})
class Test1 implements ServiceA{

      public void display(){
        Log.debug("Test1");
      }
}

@Component (description = "Test2 service", ds = true, immediate = true)
@Service (value = {ServiceA.class})
class Test2 implements ServiceA{

      public void display(){
        Log.debug("Test2");
      }
}

//How to write factory ?
class Factory{

    public ServiceA getObject(String testType){
         if(testType.equals("Test1")){
             return Test1;
         }
         else{
             return Test2;
         }
    }
}

虽然不清楚应用程序打算如何使用这些不同的服务实现,但一种方法是使用服务属性,然后在服务使用者实际引用这些服务时需要该属性,例如:

组件(description=“Test1服务”,ds=true,immediate=true) @服务(值={ServiceA.class}) @属性(name=“type”,value=“test1”) 类Test1实现ServiceA{ // ... } @组件(description=“Test2服务”,ds=true,immediate=true) @服务(值={ServiceA.class}) @属性(name=“type”,value=“test2”) 类Test2实现ServiceA{ // ... } …在消费者端,您只需为参考添加服务选择标准,例如:

@组件(…)
类支原体{
// ...
@引用(target=“(type=test2)”)
服务a测试服务2;
// ...
}
不需要工厂!:)

有关更多信息,请查看

如果需要根据运行时服务请求属性动态路由到特定的服务实现,还可以保留对所有服务实现的引用,并使用所需属性映射它们以进行快速选择,例如:

@组件(…)
类支原体{
// ...
专用最终地图服务=/。。。
@参考文献(
基数=ReferenceCardinality.MULTIPLE,
policy=ReferencePolicy.DYNAMIC,
service=ServiceA.class,
target=“(type=*)”
)
public void addServiceA(ServiceA实例、映射属性){
service.put(String.valueOf(properties.get(“type”)),实例);
}
public void removeServiceA(映射属性){
remove(String.valueOf(properties.get(“type”));
}
// ...
}

您能更详细地解释一下为什么要这样做吗。通常,您会将服务对象直接注入到实际需要使用它的类中。这是我的意图。因为我是OSGi的新手,所以我用经典的方式想象一切。因此,如果按照OSGi有任何其他方法,请指导我。我相信您的应用程序的用户不会在意您使用的是工厂。正如我在前面的评论中所建议的,您可以直接将服务实例注入到实际需要它的地方。