我有一个遗留的 Java 企业应用程序,它将一堆服务注册为 Spring bean 并将它们注册到 JNDI。我想将其转换为将 Spring 与 OSGi 一起使用。
以前,服务类只是包含在需要它的任何其他类的类路径中,并且有一个看起来像这样的静态方法:
public class SomeService {
// private fields...
public static SomeService getInstance() {
SomeService svc = null;
try {
InitialContext ctx = new InitialContext();
svc = (SomeService)ctx.lookup("java:/SomeService");
} catch (NamingException ex) {
logger.info("Exception in getNamedObject", ex);
}
return svc;
}
// Setters and getters, some of which are filled-in with Spring beans
// Other methods etc...
}
无论在哪里使用该服务,我们都有这样的代码:
SomeService svc = SomeService.getInstance();
// or even
SomeObject results = SomeService.getInstance().getSomeObject();
现在,我意识到转换它的“正确”方法是getInstance()
完全删除并强制接口的所有用户拥有自己对实现的引用,由 Spring 提供并在 META-INF 的 xml 文件中配置。但是,由于系统已经投入生产,因此这种更改太大而无法一次完成)。
有什么方法可以获取类似于上述 JNDI 方法的 OSGi 服务实例?
更新:一些澄清
只是为了更加清楚我的目标 - 我知道这通常不是一个好方法。然而,这是一个正在生产中的大型企业应用程序,为了适应“理想”的 OSGi 结构而一次性改变整个事情是一次太大的改变。
我在这里尝试完成的是拆分应用程序的一小部分并使其准备好作为单独的 OSGi 包提供服务。但是由于应用程序的其余部分——“客户端代码”,如果你愿意的话——还没有准备好进行这种更改,我必须有一个中间步骤,让我既可以以旧方式使用此代码,也可以将其用作 OSGi 服务。随着时间的推移,其余的应用程序也将被模块化和 OSGi 化,最终这些静态工厂方法将被完全删除。
然而,在那之前,“这是执行 OSGi 的错误方法”的评论对我来说并不是很有帮助——我知道它不是,但这甚至不是我的最终形式......