Java 在运行时获取声明性服务

Java 在运行时获取声明性服务,java,osgi,declarative-services,Java,Osgi,Declarative Services,当您在运行后才知道要请求的服务的属性时,获取服务的正确方法是什么(如果可能,最好使用声明性服务) 该用例类似于有3个捆绑包提供1.0、2.0和3.0版的服务,但在用户在UI中选择一个之前不知道将使用哪一个捆绑包。如果用户选择2.0,消费者将使用捆绑包2.0中的内容 我们使用的是BND注释,因此使用BND注释会很理想,但我觉得我们需要直接使用OSGiAPI,而不是使用注释或声明性服务注入 最后,如果相关的话,这更多的是获取不同版本的资源(XML模式),而不是不同的行为/实现。这个想法是服务将提供其

当您在运行后才知道要请求的服务的属性时,获取服务的正确方法是什么(如果可能,最好使用声明性服务)

该用例类似于有3个捆绑包提供1.0、2.0和3.0版的服务,但在用户在UI中选择一个之前不知道将使用哪一个捆绑包。如果用户选择2.0,消费者将使用捆绑包2.0中的内容

我们使用的是BND注释,因此使用BND注释会很理想,但我觉得我们需要直接使用OSGiAPI,而不是使用注释或声明性服务注入


最后,如果相关的话,这更多的是获取不同版本的资源(XML模式),而不是不同的行为/实现。这个想法是服务将提供其内部资源,每个版本的内部资源都不同,即使服务中的代码本身是相同的

声明性服务规范的声明性模型是构建时模型,而不是运行时模型。要执行运行时依赖关系管理,您需要使用ServiceTracker自己执行,或者使用不同的依赖关系管理解决方案

作为其作者之一,我更喜欢ApacheFelix依赖关系管理器[1],它允许您在Java代码中“声明”依赖关系(在运行时,例如根据用户在UI中所做的选择),它不使用Bnd注释,但代码仍然允许您使用声明式样式,并提供注入和/或回调等功能

另一个解决方案是ApacheFelixIpojo[2]

[1]


[2]

我以前在类似的系统中工作过,我们有自己的“路由”系统。基本上,当您注册服务时,在元数据中添加版本号。然后在此路由机制中选择正确的服务。您的服务需要实现一个公共接口,并在路由器中插入一个
列表

我们目前正在考虑iPojo。它的哪些部分可以用于执行此运行时决策。我还将看一下Dependency Manager我对它不太熟悉,但我知道(不久前)它增加了对通过Java API声明依赖关系的支持,就像Dependency Manager一样。所以你是说一个服务,它刚刚收到所有其他已注册服务的通知,然后是这个服务,你称之为路由机制,将通过列表提供所有累积服务的列表?如果这就是你的意思,问题是我想象这个路由系统只是一个服务注册表,我想象它一定已经存在于OSGi框架中。问题是,在运行时,你希望所有版本都可用,并根据用户的请求进行选择,所以我们就是这样解决的。路由器不提供列表,它有列表。它获取请求,然后返回要使用的正确版本化实现。