Как создать экземпляр Spring Bean с помощью загрузчика классов? - PullRequest
1 голос
/ 26 марта 2012

У меня есть особое требование, чтобы я был динамически (во время выполнения) способен загружать и выгружать классы бинов в моем контейнере Spring IoC.

Боб должен быть

  1. создано
  2. 1008 * уничтожены *
  3. создано заново (из того же класса, возможно, новая версия того же класса)

Проблема, с которой я сталкиваюсь, заключается в том, что, поскольку класс на шаге 1 загружается в системный загрузчик классов, он остается там даже при уничтожении компонента. Итак, на шаге 3 я получаю объект старого класса, а не нового.

Итак, решение моей проблемы - загрузить класс в MyClassLoader вместо системного загрузчика классов.

Так что мои шаги становятся

  1. создать определенный загрузчик классов
  2. создать компонент с помощью специального загрузчика классов
  3. установить ссылку на bean-компонент в null и удалить компонент из AppContext
  4. установить ссылку на загрузчик классов на ноль

перезагрузите бин, используя шаги 1 и 2

Мой вопрос: как реализовать вышеуказанный подход в контейнере Spring IoC?

Спасибо,

С уважением,

Vimal

Ответы [ 2 ]

4 голосов
/ 26 марта 2012

Вы можете переместить некоторые из ваших объектов в контекст, который будет перезагружен с помощью специального загрузчика классов.Чтобы убедиться, что используется правильный загрузчик классов, вызовите context.setClassLoader(classLoader) перед вызовом обновления или установите потоковый загрузчик классов через Thread.currentThread().setContextClassLoader(classLoader).Также имейте в виду, что классы, которые вы хотите перезагрузить, будут доступны для некоторого общего родительского загрузчика классов, они не будут перезагружены, поскольку родительский загрузчик классов всегда имеет приоритет.

1 голос
/ 26 марта 2012

Может ли JRebel быть решением?

...