2011-11-07 9 views
4

OSGiバンドル内のいくつかのビジネス条件に基づいてBeanをロードするためにSpringを使用する必要があるアプリケーションがあります。このBeanはエクスポート用ではなく、自分のバンドル内の計算に使用されます。基本的に私はエクスポートされる実際のサービスコンポーネントを持っており、このSpring Beanを内部的に使用する必要があります。しかし...OSGiバンドル内でSpring Beanを使用するにはどうすればいいですか?

  1. 私がSpring DMを使用するとき、エクステンダはアプリケーションコンテキストを別のスレッドにロードします。私のバンドル内のコンテキストファイルにアクセスするには?
  2. エクステンダスレッドがアプリケーションコンテキストをロードしてバンドル内で使用できるようにする方法を教えてください。
  3. 私は内部目的でバンドル内でのみ使用されるため、SpringのDMのようにアプリケーションコンテキストをサービスとしてエクスポートしたくありません。

これを実行する方法はありますか?

+0

言語タグ(Javaなど)を追加すると、あなたの質問がよりよくなる可能性があります。また、スペル、文法、大文字をクリーンアップすることもできます。あなたの質問はより真剣に取られます。 –

答えて

11

あなたが達成しようとしているもののためにSpring DMは必要ありません。

あなたがしたいことは、実際にあなたのバンドルの中のコンテキストにアクセスし、ctx.getBean()を使っていくつかのクラスをルックアップしているように思えます。このような場合は、OSGiにいなくても、手動でバンドル内にコンテキストを作成してコールするだけです。春のDMはまったく関与していません。

ここでの問題の1つは、バンドルクラスローダーを提供するために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()メソッドのためのものです。前述のように、バンドルクラスローダーを指定する必要があります。 – Robin

関連する問題