我正在 Java EE 环境中工作,其中每个应用程序都位于其自己的 war 文件中。 在每个应用程序 war 文件的 WEB-INF/lib 中,有一个由所有应用程序共享的公共(public) jar。 这个公共(public) jar 包含几个可以从代码中的许多点访问的单例。 由于 war 文件边界,每个应用程序都有自己的单例实例。 这就是我们今天的操作方式,因为我们希望在每个应用程序中以不同的方式配置一些单例。
现在我们正在转向 OSGi 环境,该解决方案将不再起作用,因为每个包都有自己的类加载器,因此如果我尝试访问位于包“appA.jar”中的包“common.jar”中的 MySingleton ”或者从 bundle “appB.jar”中我将获得相同的实例。
记住我“想要”每个包有一个不同的单例实例。 (听起来很讽刺)
现在我意识到理想的解决方案是修复代码以不依赖于这些单例,但是由于时间紧迫,我想知道你们是否可以建议某种迁移解决方案,让我可以使用 bundle -宽单例,这样他们每个人都可以 按 bundle 进行配置。
最佳答案
您的单例将成为 OSGi 中的一项服务。
然后你需要创建一个 ManagedServiceFactory (例如这个 article )负责注册该服务的不同实例;每个服务将使用不同的属性进行注册(例如 application="appA"和 application="appB")
之后,您将从任何执行正常服务查找并指定正确属性的应用程序访问正确的服务。
关于java - OSGI环境中单例的迁移解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1318856/