我有以下捆绑包: - GreetingAPI(定义greeting()方法的包)(服务) - GreetingImpl1(实现英语模式的greeting()方法的包) - GreetingImpl2(实现意大利模式的greeting()方法的包) - GreetingConsumer(使用问候语服务的包)
我如何创建一个基于给定语言参数的组件(我认为它是一个工厂),让消费者包使用不同的服务实现.
你正在考虑这个错误的方法.提供商不应根据消费者所做的事情注册不同的服务,因为提供商不应该了解消费者的任何信息.
相反,您可以拥有相同服务的多个提供程序,但使用适当的元数据对其进行注释.然后,服务的使用者可以选择是否过滤特定属性.
例如,当我们注册服务时,我们可以按如下方式添加属性(请注意,我使用的是OSGi声明服务注释,请参阅OSGi Compendium第5版,第112.8节):
@Component(property = "locale=en_GB")
public class MyGreetingImpl1 implements Greeting {
public String greet() { return "How do you do"; }
}
@Component(property = "locale=en_US")
public class MyGreetingImpl2 implements Greeting {
public String greet() { return "Howdy"; }
}
@Component(property = "locale=fr_FR")
public class MyGreetingImpl3 implements Greeting {
public String greet() { return "Bonjour"; }
}
Run Code Online (Sandbox Code Playgroud)
现在,消费者可以使用目标过滤器选择任何语言.请注意使用通配符,因为在这种情况下,消费者只关心语言而不关心国家/地区代码:
@Component
public class GreetingConsumer {
@Reference(target = "(language=en*)")
public void setGreeting(Greeting greeting) { ... }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |