假设我的Book
API 包中有一个接口,BookImpl
我的实现包中有一些实现。通常,对于单例,我会使用服务注册表来获取我的实现。但是,对于Book
,我想在每次获得实现时创建一个新实例。
在 OSGi 中执行此操作的正常模式是什么?
我是否可以使用从服务注册表中获取并用于创建图书实例BookCreator
的方法提供服务?createBook
这是一个不错的选择,是的。您还可以考虑其中一种服务注入框架,例如声明式服务或蓝图。蓝图允许您指定原型范围,以便“书”的每个使用者都有自己的实例,该实例可能足够独特,也可能不足以帮助您的用例。(DS也有类似的东西。)
但是,即使是同一个消费者实例也需要获取多个“Book”并且您使用工厂,使用这些框架之一将使您的服务访问更加健壮。
在两年前对这个问题进行了长时间的思考之后,我发现提出的解决方案,作为工厂的服务,是最好的解决方案。原因是相关的类型安全。声明式服务确实具有内置的组件工厂的可能性,它允许您创建组件实例,它的使用不像类型安全工厂那么容易。我还考虑将这个概念放入框架中,但也缺乏简单的工厂服务。
所以是的,你的想法是我所知道的最好的解决方案。