4

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

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

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

4

1 に答える 1

11

達成しようとしていることのためにSpringDMは必要ありません。

あなたがやりたいのは、実際にはバンドル内のコンテキストへのアクセスを提供し、ctx.getBean()を介していくつかのクラスにルックアップを実行させることのようです。この場合は、OSGiを使用していない場合と同じように、バンドル内にコンテキストを手動で作成して呼び出しを行います。SpringDMはまったく関与していません。

ここでの1つの問題は、バンドルクラスローダーを提供するためにClassPathXmlApplicationContextを拡張する必要があることです。それ以外の場合は、スレッドコンテキストクラスローダーを使用するためです。

ApplicationContext ctx = new ClassPathXmlApplicationContext(myCtxPath)
{
    protected void initBeanDefinitionReader(XmlBeanDefinitionReader reader)
    {
        super.initBeanDefinitionReader(reader);
        reader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_NONE);
        reader.setBeanClassLoader(getClassLoader());
    }
}
于 2011-11-09T15:44:40.813 に答える