我想开发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用作存储。
这种情况是否可行?
答案 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*)")