OSGi - 如何 OSGi - 我可以创建一个组件来根据参数注册不同的实现?工厂?

标签 osgi factory

我有以下 bundle : - GreetingAPI(定义 greeting() 方法的包)(服务) - GreetingImpl1(为英语模式实现 greeting() 方法的包) - GreetingImpl2(为意大利语模式实现 greeting() 方法的包) - GreetingConsumer(使用问候服务的包)

我如何创建一个基于给定语言参数的组件(我想它是一个工厂)让消费者捆绑使用服务的不同实现。

最佳答案

您的想法是错误的。提供者不应根据消费者所做的事情注册不同的服务,因为提供者不应该了解消费者的任何信息。

相反,您可以拥有同一服务的多个提供者,但使用适当的元数据对它们进行注释。然后服务的消费者可以选择是否过滤特定属性。

例如,当我们注册一个服务时,我们可以按如下方式添加属性(请注意,我使用的是 OSGi 声明式服务注释,请参阅 OSGi Compendium Release 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"; }
}

现在,消费者可以使用目标筛选器选择所需的语言。注意通配符的使用,因为在这种情况下消费者只关心语言而不关心国家代码:

@Component
public class GreetingConsumer {

    @Reference(target = "(language=en*)")
    public void setGreeting(Greeting greeting) { ... }

}

关于OSGi - 如何 OSGi - 我可以创建一个组件来根据参数注册不同的实现?工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31891995/

相关文章:

java - 如何以良好的方式从 Spring DI 迁移到 OSGi DI?

java - Weld-osgi-bundle-2.2.10.Final 无法解析 sun.misc

java - 在运行时更改数据类型实例的正确设计模式

php - 如何在 __construct 中使用其父工厂实例化子类

java - OSGi 包更新后如何重新布线框架

osgi - Websockets Bundle 对 sun.misc 的依赖

java - 如何使用 Spring DM 在 AWT EventQueue 上创建 Swing OSGi 包

java - 基于命令行参数创建子类对象的最佳方法

Typescript AST 工厂 - 如何使用注释?

C++:结合继承、多态和工厂