Java 如何在OSGi包中使用Springbean?
我有一个应用程序,在这个应用程序中,我必须根据OSGi包中的一些业务条件使用Spring来加载bean。此bean不用于导出,而是用于在我的包中进行计算。基本上我有一个实际的服务组件,它是导出的,它必须在内部使用这个Springbean。但是Java 如何在OSGi包中使用Springbean?,java,spring,osgi,spring-dm,Java,Spring,Osgi,Spring Dm,我有一个应用程序,在这个应用程序中,我必须根据OSGi包中的一些业务条件使用Spring来加载bean。此bean不用于导出,而是用于在我的包中进行计算。基本上我有一个实际的服务组件,它是导出的,它必须在内部使用这个Springbean。但是 当我使用SpringDM时,扩展器在一个单独的线程中加载应用程序上下文。如何访问捆绑包中的上下文文件 如何确保extender线程找到加载的应用程序上下文,以便我可以在包中使用它 我不想像SpringDM那样将应用程序上下文导出为服务,因为它只在包中用于内
有没有办法做到这一点 您不需要Spring DM来完成您想要完成的任务 听起来您想要做的实际上是提供对包中上下文的访问,并让一些类通过ctx.getBean()进行查找。如果是这种情况,只需像不在OSGi中一样在包中手动创建上下文并进行调用。根本没有涉及到Spring DM 这里的一个问题是,您必须扩展ClassPathXmlApplicationContext以提供bundles类加载器,否则它将使用线程上下文类加载器
ApplicationContext ctx = new ClassPathXmlApplicationContext(myCtxPath)
{
protected void initBeanDefinitionReader(XmlBeanDefinitionReader reader)
{
super.initBeanDefinitionReader(reader);
reader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_NONE);
reader.setBeanClassLoader(getClassLoader());
}
}
如果您在问题中添加语言标记(即Java),您的问题可能会得到更好的关注。你可能还想清理你的拼写、语法和大写字母;你的问题会被更严肃地对待。我必须添加以下内容以使其生效:reader.setBeanClassLoader(properClassLoader);这就是getClassLoader()方法的用途,正如前面提到的,您必须提供bundle类加载器。