OSGi-I如何创建基于参数注册不同实现的组件?工厂

OSGi-I如何创建基于参数注册不同实现的组件?工厂,osgi,factory,Osgi,Factory,我有以下几个包: -GreetingAPI(定义greeting()方法的包)(服务) -GreetingImpl1(实现英语模式的greeting()方法的捆绑包) -GreetingImpl2(实现意大利语模式的greeting()方法的捆绑包) -GreetingConsumer(使用问候服务的捆绑包) 如何创建一个基于给定语言参数的组件(我想它是一个工厂),让使用者捆绑包使用不同的服务实现 你想得不对。提供者不应该根据使用者所做的事情注册不同的服务,因为提供者不应该知道有关使用者的任何信

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


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

你想得不对。提供者不应该根据使用者所做的事情注册不同的服务,因为提供者不应该知道有关使用者的任何信息

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

例如,当我们注册一个服务时,我们可以添加如下属性(请注意,我使用的是OSGi声明性服务注释,请参阅OSGi概要第5版,第112.8节):

组件(property=“locale=en_GB”) 公共类MyGreetingImpl1实现问候语{ 公共字符串greet(){返回“你好”;} } @组件(property=“locale=en_-US”) 公共类MyGreetingImpl2实现问候语{ 公共字符串greet(){return“Howdy”;} } @组件(property=“locale=fr\u fr”) 公共类MyGreetingImpl3实现问候语{ 公共字符串greet(){返回“你好”;} } 现在消费者可以使用目标过滤器选择想要的语言。请注意通配符的使用,因为在这种情况下,消费者只关心语言,而不关心国家代码:

@组件
公共类迎接消费者{
@参考(target=“(language=en*)”)
公共问候语(问候语){…}
}

您的想法是错误的。提供者不应该根据使用者所做的事情注册不同的服务,因为提供者不应该知道有关使用者的任何信息

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

例如,当我们注册一个服务时,我们可以添加如下属性(请注意,我使用的是OSGi声明性服务注释,请参阅OSGi概要第5版,第112.8节):

组件(property=“locale=en_GB”) 公共类MyGreetingImpl1实现问候语{ 公共字符串greet(){返回“你好”;} } @组件(property=“locale=en_-US”) 公共类MyGreetingImpl2实现问候语{ 公共字符串greet(){return“Howdy”;} } @组件(property=“locale=fr\u fr”) 公共类MyGreetingImpl3实现问候语{ 公共字符串greet(){返回“你好”;} } 现在消费者可以使用目标过滤器选择想要的语言。请注意通配符的使用,因为在这种情况下,消费者只关心语言,而不关心国家代码:

@组件
公共类迎接消费者{
@参考(target=“(language=en*)”)
公共问候语(问候语){…}
}

一种可能的解决方案是使用某种语言管理器。因此,您的消费者有一个语言管理器,而不是直接使用问候语服务 经理会收到关于您的GreetingAPI的每种语言实现的注册/注销通知。 您的语言管理器跟踪不同的实现。您的管理器提供了目标语言的正确实现(例如使用枚举)

范例

公共类LanguageManagerImpl实现LanguageManager{
//LanguageEnum可用于区分不同的语言
私有映射问候语=新HashMap();
公共无效注册表项(GreetingAPI问候语){
LanguageEnum language=greeting.getLanguageEnum();
//将问候语添加到地图中
}
公共作废注销语言(问候语API问候语){
//从地图中删除您的问候语
}
公共问候API getGreetingForLanguage(LanguageEnum语言){
回敬问候。获取(语言);
}
}
如果您使用的是blueprint,那么您需要向language manager blueprint添加一个引用列表,其中包含GreetingAPI上的引用侦听器 否则,您将使用传统的侦听器

范例


一种可能的解决方案是使用某种语言管理器。因此,您的消费者有一个语言管理器,而不是直接使用问候语服务 经理会收到关于您的GreetingAPI的每种语言实现的注册/注销通知。 您的语言管理器跟踪不同的实现。您的管理器提供了目标语言的正确实现(例如使用枚举)

范例

公共类LanguageManagerImpl实现LanguageManager{
//LanguageEnum可用于区分不同的语言
私有映射问候语=新HashMap();
公共无效注册表语言(问候API问候语){
LanguageEnum language=greeting.getLanguageEnum();
//将问候语添加到地图中
}
公共作废注销语言(问候语API问候语){
//从地图中删除您的问候语
}
公共问候API getGreetingForLanguage(LanguageEnum语言){
回敬问候。获取(语言);
}
}
如果您使用的是blueprint,那么您需要向language manager blueprint添加一个引用列表,其中包含GreetingAPI上的引用侦听器 否则,您将使用传统的侦听器

范例