【问题标题】:How do I use a Spring bean inside an OSGi bundle?如何在 OSGi 包中使用 Spring bean?
【发布时间】:2011-12-23 19:20:56
【问题描述】:

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

  1. 当我使用 Spring DM 时,扩展程序在单独的线程中加载应用程序上下文。如何访问我的包中的上下文文件?
  2. 如何确保扩展程序线程完成加载应用程序上下文,以便我可以在我的包中使用它?
  3. 我不想像 Spring DM 那样将应用程序上下文导出为服务,因为它仅在我的包中用于内部目的。

有没有办法做到这一点?

【问题讨论】:

  • 如果您向其添加语言标签(即 Java),您的问题可能会得到更好的关注。您可能还想清理拼写、语法和大写;您的问题将得到更认真的对待。

标签: java spring osgi spring-dm


【解决方案1】:

您想要完成的工作不需要 Spring DM。

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

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

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

【讨论】:

  • 我必须添加它才能使其工作:reader.setBeanClassLoader(properClassLoader);
  • 这就是 getClassLoader() 方法的用途,如前所述,您必须提供捆绑类加载器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
  • 2014-01-15
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
相关资源
最近更新 更多