osgi - 如何在 OSGi 中编写工厂模式?
问题描述
我有多个实现相同服务的 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;
}
}
}
解决方案
尽管尚不清楚您的应用程序打算如何使用这些不同的服务实现,但一种方法是使用服务属性,然后在服务使用者实际引用这些服务时需要该属性,例如:
@Component (description = "Test1 service", ds = true, immediate = true)
@Service (value = {ServiceA.class})
@Property (name = "type", value = "test1")
class Test1 implements ServiceA{
// ...
}
@Component (description = "Test2 service", ds = true, immediate = true)
@Service (value = {ServiceA.class})
@Property (name = "type", value = "test2")
class Test2 implements ServiceA{
// ...
}
...在消费者方面,您只需添加参考的服务选择标准,例如:
@Component (...)
class MyConsumer {
// ...
@Reference(target="(type=test2)")
ServiceA testService2;
// ...
}
不需要工厂!:)
有关更多信息,请查看这篇小文章。
如果您需要根据运行时服务请求属性动态路由到特定服务实现,您还可以保存对所有服务实现的引用并使用所需属性映射它们以进行快速选择,例如:
@Component (...)
class MyConsumer {
// ...
private final Map<String, ServiceA> services = // ...
@Reference(
cardinality = ReferenceCardinality.MULTIPLE,
policy = ReferencePolicy.DYNAMIC,
service = ServiceA.class,
target = "(type=*)"
)
public void addServiceA(ServiceA instance, Map properties) {
service.put(String.valueOf(properties.get("type")), instance);
}
public void removeServiceA(Map properties) {
service.remove(String.valueOf(properties.get("type")));
}
// ...
}
推荐阅读
- node.js - 无法使用 sequelize 更新表
- go - 如果条件为真,如何检查条件,停止代码并退出应用程序,如果条件不成立,则发生超时退出应用程序
- flutter - 我可以使用 Flutter 计算当前速度吗?
- directx - 如果我使用顶点着色器对对象进行所有操作,那么常量缓冲区可以为空吗?
- visual-studio-code - 如何批量重命名 VS Code 中的文件?
- amazon-web-services - VPN VPC 中的 DNS 名称
- python - XLwings - 即使使用 kill() 方法也无法让 Excel 应用程序退出
- haskell - 如何使我的 Haskell 函数尽可能短?
- reactjs - Material-UI 应用 backgroundColor 不起作用
- alloy - 如何在启动合金时删除警告,我的合金 GUI 也有一些看起来像问题的条纹