如何在OSGi包中使用Spring bean?

时间:2011-11-07 17:08:53

标签: java spring osgi spring-dm

我有一个应用程序,我必须使用Spring根据OSGi包中的某些业务条件加载bean。这个bean不用于导出,用于计算inisde我的包。基本上我有一个实际的服务组件,它被导出,并且它必须在内部使用这个Spring bean。但...

  1. 当我使用Spring DM时,扩展程序会在单独的线程中加载应用程序上下文。如何访问我的包中的上下文文件?
  2. 如何确保扩展程序线程能够加载应用程序上下文以便我可以在我的包中使用它?
  3. 我不想像Spring DM那样将应用程序上下文导出为服务,因为它仅用于内部用途。
  4. 有没有办法做到这一点?

1 个答案:

答案 0 :(得分:11)

您不需要Spring DM来完成您想要完成的任务。

听起来你想要做的事实上是提供对你的bundle内部的上下文的访问,并让一些类通过ctx.getBean()进行查找。如果是这种情况,只需手动创建捆绑包中的上下文,就像您不在OSGi中进行调用一样。根本没有涉及Spring DM。

这里的一个问题是你必须扩展ClassPathXmlApplicationContext以提供bundle类加载器,否则它将使用线程上下文类加载器。

ApplicationContext ctx = new ClassPathXmlApplicationContext(myCtxPath)
{
    protected void initBeanDefinitionReader(XmlBeanDefinitionReader reader)
    {
        super.initBeanDefinitionReader(reader);
        reader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_NONE);
        reader.setBeanClassLoader(getClassLoader());
    }
}