2012-03-26 114 views
1

我有一个具体的要求,我应该动态地(在运行时)能够加载和卸载我的Spring IoC容器中的bean类。如何使用类加载器实例化spring bean?

一个bean必须

  1. 创建
  2. 破坏
  3. 重新创建(同一类,同一类的可能的新版本)

我是问题面对的是,因为第1步中的类被加载到系统类加载器中,所以即使在我销毁bean时它仍然存在。所以在第三步中,我得到了旧班级的一个对象,而不是新班级。

所以我的问题的解决方案是加载类MyClassLoader而不是系统类加载器。

所以我的步骤变得

  1. 创建特定的类加载器
  2. 使用特定的类加载器
  3. 设置bean的引用为null,从AppContext
  4. 设置的类加载器的参考,除去豆创建bean null

使用步骤1和2重新加载bean

我的问题是如何在Spring IoC容器中实现上述方法?

感谢,

问候,

VIMAL

+1

你可以用新的类加载器重新创建spring上下文吗?请记住,重新创建bean不会将它重新注入到现有的bean中,而只要它被引用。还记得父类加载器总是优先于后代。 – mrembisz 2012-03-26 09:20:54

+0

@mrembisz嗨,似乎是一个好主意,在新的类加载器中创建AppContext本身。我会试一试。但是在新的类加载器中创建一个AppContext将确保这个上下文中的所有bean也被加载到同一个类加载器中? – weima 2012-03-26 09:24:18

+0

你应该调用context.setClassLoader(classLoader)来确保。你也想重载的类在classLoader的父类中不可用。 – mrembisz 2012-03-26 10:25:55

回答

3

您可以将一些对象移动到将用专用类加载器重新加载的上下文。为了确保使用正确的类加载器,请在调用刷新之前调用context.setClassLoader(classLoader)或通过Thread.currentThread().setContextClassLoader(classLoader)设置线程类加载器。另外请记住,如果要重新加载的类可用于某个公用父类加载器,则它们将不会被重新加载,因为父类加载器始终优先。

1

JRebel或许是一个解决办法?

+0

JRebel是一款开发工具。我想,Vimal想在应用程序中完成这项工作。 – vacuum 2012-03-26 11:12:33

+0

@vacuum - 呃,不,不是。这是一个JVM插件。有些人可能只用它进行开发,但JRebel/LiveRebel可以实现热代码重新部署,并且零停机时间部署是一项特色产品。 – pap 2012-03-26 14:05:16

相关问题