Java 如何使用类加载器实例化Springbean?

Java 如何使用类加载器实例化Springbean?,java,spring,inversion-of-control,Java,Spring,Inversion Of Control,我有一个特定的要求,即我应该能够在运行时动态地在SpringIOC容器中加载和卸载bean类 一粒豆子需要被烤熟 创建 摧毁 从同一类再次创建,可能是同一类的新版本 我面临的问题是,由于步骤1中的类是在system classloader中加载的,所以即使我销毁了bean,它也会保留在那里。因此,在步骤3中,我得到一个旧类的对象,而不是新类的对象 因此,我的问题的解决方案是在MyClassLoader中加载类,而不是在system classloader中加载 所以我的脚步变得 创建特定的类加载

我有一个特定的要求,即我应该能够在运行时动态地在SpringIOC容器中加载和卸载bean类

一粒豆子需要被烤熟

创建 摧毁 从同一类再次创建,可能是同一类的新版本 我面临的问题是,由于步骤1中的类是在system classloader中加载的,所以即使我销毁了bean,它也会保留在那里。因此,在步骤3中,我得到一个旧类的对象,而不是新类的对象

因此,我的问题的解决方案是在MyClassLoader中加载类,而不是在system classloader中加载

所以我的脚步变得

创建特定的类加载器 使用特定的类装入器创建bean 将bean引用设置为null并从AppContext中删除bean 将classloader引用设置为null 使用步骤1和2重新加载bean

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

谢谢

问候,


Vimal可能是一个解决方案?

可能是一个解决方案?

您可以将一些对象移动到一个上下文中,该上下文将使用专用类加载器重新加载。要确保使用了正确的类加载器,请在调用refresh或通过thread.currentThread.setContextClassLoaderclassLoader设置线程类加载器之前调用context.setClassLoaderclassLoader。还请记住,如果要重新加载的类对某些常见的父类加载器可用,则不会重新加载它们,因为父类加载器始终优先。

您可以将一些对象移动到将使用专用类加载器重新加载的上下文中。要确保使用了正确的类加载器,请在调用refresh或通过thread.currentThread.setContextClassLoaderclassLoader设置线程类加载器之前调用context.setClassLoaderclassLoader。还请记住,如果要重新加载的类对某些常见的父类加载器可用,则不会重新加载它们,因为父类加载器始终优先。

您能用新的类加载器重新创建spring上下文吗?请记住,无论引用到哪里,重新创建bean都不会将其重新注入现有bean。还要记住父类加载器总是优先于子类。@mrembisz hi,在新类加载器中创建AppContext本身似乎是个好主意。我要试一试。但是在一个新的类加载器中创建AppContext会确保该上下文中的所有bean也被加载到同一个类加载器中吗?您应该调用context.setClassLoaderclassLoader来确保。另外,您要重新加载的类在类加载器的父级中不可用。@mrembisz请将上述解决方案作为答案。我会选择这个作为答案。非常感谢。你能用一个新的类加载器重新创建spring上下文吗?请记住,无论引用到哪里,重新创建bean都不会将其重新注入现有bean。还要记住父类加载器总是优先于子类。@mrembisz hi,在新类加载器中创建AppContext本身似乎是个好主意。我要试一试。但是在一个新的类加载器中创建AppContext会确保该上下文中的所有bean也被加载到同一个类加载器中吗?您应该调用context.setClassLoaderclassLoader来确保。另外,您要重新加载的类在类加载器的父级中不可用。@mrembisz请将上述解决方案作为答案。我会选择这个作为答案。非常感谢。JRebel是一个开发工具。我想,Vimal想在应用程序中完成这项工作。@vacuum-嗯,不,不是。这是一个JVM插件。有些人可能只在开发时使用它,但JRebel/LiveRebel支持热代码重新部署,零停机部署是一个特色产品。JRebel是一个开发人员工具。我想,Vimal想在应用程序中完成这项工作。@vacuum-嗯,不,不是。这是一个JVM插件。有些人可能只将其用于开发,但JRebel/LiveRebel支持热代码重新部署,零停机部署是一项特色服务。