我已经从现有的传统战争中创建了一个osgi包。该应用程序有一个实现Spring接口ApplicationContextAware的类,然后它使用上下文以编程方式获取bean(不知道为什么,但最终需要重构)。该应用程序现在使用OsgiBundleXmlApplicationContext,但我认为使用它存在一个问题,即在实现ApplicationContextAware的任何类中都不会调用setApplicationContext方法,因此现在此类中的上下文始终为null。
因此,作为一种解决方法,我已经实现了BundleContextAware,这样我就可以获得对已发布上下文的引用,并以这种方式访问bean。这工作正常但是上下文中唯一的bean是warDeployer(应该提到我使用spring dm bundle spring-extender来部署战争)。上下文中出现的包是我的包,所以我不明白为什么我得到的上下文没有我的bean。我必须获得应用程序上下文的代码是:
ServiceReference ref = bundleContext.getServiceReference(ApplicationContext.class.getName());
applicationContext = (OsgiBundleXmlApplicationContext) bundleContext.getService(ref);
我可以在日志中看到我的大部分上下文都被创建了,所以我看不出他们为什么不在我得到的上下文中。
任何人都可以建议什么是错的?我知道这种方法有点笨拙,但在现有代码被重构之前它是暂时的。
提前致谢。
百里
答案 0 :(得分:1)
我认为ApplicationContext服务是由Spring-DM扩展器异步注册的。所以你可能有竞争条件,即在实际注册之前就要求服务。
你可以引入一个延迟,但是你会非常深入到讨厌的黑客领域。最好弄清楚为什么没有设置setApplicationContext
bean上的ApplicationContextAware
方法。你应该尝试提高这是一个针对Spring-DM的bug或者在Spring-DM Google Group中提出的问题。