OSGI - 从另一个Component类中选择要激活的包

时间:2017-08-09 05:32:36

标签: java osgi apache-karaf apache-felix

我想开发OSGI存储服务,所以我创建了一个名为Store的接口。现在,我有两个实现此接口的类。

SqlStorage.java

@Component(immediate = true)
@Service
public class SqlStorage implements Store {
    //some code here
}

MongoStorage.java

@Component(immediate = true)
@Service
public class MongoStorage implements Store {
    //some code here
}

现在,我有另一个依赖于Store的捆绑包。

@Component(immediate = true)
@Service
public class StoreManager implements StoreService {
    // how can I select one of the implmentation here
    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
    public Store store;
}

StoreManager如何选择使用Store的哪个实现?

假设,StoreManager能够选择是将SQL还是MongoDB用作存储。

这种情况是否可行?

1 个答案:

答案 0 :(得分:1)

您的商店经理希望决定使用哪种Store实施方式?正如您目前所定义的那样,Store实现是等效的,同样也是很好的答案,因此OSGi将任意选择一个。

如果那不是您想要的,那么您需要添加服务属性来区分商店。例如:

@Component(property = { "region=NorthAmerica", "language=en_US" })
@Component(property = { "region=Europe", "language=en_GB" })
@Component(property = { "region=Asia", "language=jp" })

然后您的商店经理可以使用目标过滤器选择所需的商店。例如,如果它想要一个英语商店(但不关心美国与英国英语),那么它可以使用以下过滤器:

@Reference(target = "(language=en*)")