2011-11-07 81 views
4

我有一個應用程序,我必須使用Spring來根據OSGi包內的一些業務條件加載一個bean。這個bean不是用於導出,而是用於計算inisde我的包。基本上我有一個實際的服務組件,它被導出,並且必須在內部使用這個Spring bean。但是...如何在OSGi包中使用Spring bean?

  1. 當我使用Spring DM時,擴展器會在單獨的線程中加載應用程序上下文。如何訪問我的包內的上下文文件?
  2. 如何確保extender線程finshes加載應用程序上下文,以便我可以在我的包中使用它?
  3. 我不想像Spring DM那樣將應用程序上下文導出爲服務,因爲它僅在我的包中用於內部目的。

有沒有辦法做到這一點?

+0

如果您爲其添加語言標記(即Java),那麼您的問題可能會得到更好的關注。你也可能想要清理你的拼寫,語法和大小寫;你的問題將更加嚴肅。 –

回答

11

你不需要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()); 
    } 
} 
+0

感謝您的回覆。這是有幫助的 – Questionevrything

+0

我不得不添加這個使它工作: reader.setBeanClassLoader(properClassLoader); – user64141

+0

這就是getClassLoader()方法的用處,正如你所提到的,你必須提供bundle類加載器。 – Robin

相關問題