2012-03-26 11 views
1

私は、Spring IoCコンテナ内でBeanクラスをロードしたりアンロードしたりできるように、実行時に動的にする必要があるという特別な要件があります。クラスローダーを使用してSpring Beanをインスタンス化する方法は?

Beanが

  1. を作成したが
  2. 再び作成
  3. (同じクラス、同じクラスの可能性の新しいバージョンから)

に私は問題を破壊する必要がありますステップ1のクラスはシステムクラスローダーにロードされているので、Beanを破棄してもそこに残ります。だからステップ3では、古いクラスのオブジェクトを取得し、新しいクラスは取得しません。

私の問題の解決策は、システムクラスローダーではなくMyClassLoaderでクラスをロードすることです。

だから私の手順は

  • 特定のクラスローダを使用してBeanを作成し、特定のクラスローダ
  • を作成

    1. になるがAppContextを
    2. から
    3. を豆をゼロにし、削除するためにBean参照を設定するには、クラスローダの参照を設定しますnull

    手順1と2を使用してBeanをリロードする

    私の質問は、Spring IoCコンテナで上記の方法を実装する方法ですか?

    おかげで、

    よろしく、

    ビマル

  • +1

    新しいクラスローダーでスプリングコンテキストを再作成できますか? Beanを再作成すると、そのBeanが参照されていた既存のBeanに再投入されません。また、親クラスローダーは常に子孫より優先されることに注意してください。 – mrembisz

    +0

    @mrembiszこんにちは、新しいクラスローダーでAppContext自体を作成することをお勧めします。私は試してみましょう。しかし、新しいクラスローダにAppContextを作成すると、このコンテキスト内のすべてのBeanも同じクラスローダにロードされるようになりますか? – weima

    +0

    context.setClassLoader(classLoader)を呼び出して確認してください。また、リロードするクラスは、classLoaderの親クラスで使用できないようにする必要があります。 – mrembisz

    答えて

    3

    オブジェクトの一部を、専用のクラスローダーで再ロードされるコンテキストに移動することができます。適切なクラスローダが使用されていることを確認するには、を呼び出してからrefreshまたはset thread classloaderを呼び出す前にThread.currentThread().setContextClassLoader(classLoader)を呼び出します。また、リロードするクラスが共通の親クラスローダーで使用できる場合は、親クラスローダーが常に優先されるため、リロードされません。

    1

    JRebelおそらく解決策になりますか?

    +0

    JRebelは開発者用ツールです。私は、Vimalはアプリでこの仕事をしたいと思う。 – vacuum

    +0

    @vacuum - そうではありません。これはJVMプラグインです。 JRebel/LiveRebelを使用すると、コードの再デプロイが可能になり、ゼロ・ダウンタイム・デプロイメントが特長です。 – pap

    関連する問題