Java Tomcat+中的类加载器之谜;春季环境

Java Tomcat+中的类加载器之谜;春季环境,java,spring,tomcat,static,classloader,Java,Spring,Tomcat,Static,Classloader,对于类A,我有两个java静态方法: private static String value; public static void setValue(String str) { value = str; } public static String getValue() { return value; } 听起来很简单。我调用A.setValue(“someValue”),然后在spring应用程序上下文加载的其他一些类中,我调用A.getValue(),返回null;同时,

对于类A,我有两个java静态方法:

private static String value;
public static void setValue(String str) {
    value = str;
}
public static String getValue() {
    return value;
}
听起来很简单。我调用A.setValue(“someValue”),然后在spring应用程序上下文加载的其他一些类中,我调用A.getValue(),返回null;同时,在原始位置,A.getValue()仍然返回“someValue”

因此,在我看来,tomcat JVM中有两个相同java类的实例。有没有办法确保一个java类只有一个实例


谢谢。

也许你这里没有一个单例,你看到的是由两个不同的类加载器加载的类a?这种情况下的一个解决方案是创建Springbean(而不是作为原型)并将其注入到您使用它的两个地方,这样框架就可以管理singleton的生命周期。如果这仍然是一个问题,您可能需要考虑上面的设计,特别是关于并发访问。p> jar文件在哪里?哪些在WEB-INF/lib和Tomcat的共享文件夹中?都在WEB-INF/lib目录中。我想它是否为单例只会影响对象的实例数。我使用的是静态方法,不知道为什么会受到影响。但无论如何,我会试着把singleton放在那里,看看会发生什么,谢谢。我真的认为你就在这里,但我觉得这个问题很有趣。我目前的理论(可能在您的标题中有说明)是Spring在其本地加载程序上创建类,而不是在您试图更新它的其他地方。这就是上述情况发生的唯一原因,对吗?Spring不可能同时管理这两个吗?我刚刚意识到Spring条目来自lib/jar文件,我无法更改。RE:Jim:是的,我也这么想,我正在试图找到一种方法来使用“扁平”类加载器,它在一个类加载器中加载所有WEB-INF/lib/jar文件和类文件。不确定是否可行,如果可行,设置是什么。