gpt4 book ai didi

java - Servlet 中的单例和 Tomcat7 上的其他类

转载 作者:行者123 更新时间:2023-11-28 23:31:20 25 4
gpt4 key购买 nike

我有一些网络应用程序。每个都在 Tomcat7 上的不同 v-hosts 中。所有这些 Web 应用程序都使用相同的库集合(由我自己编写),作为 .jar 存储在 WEB-INF/lib 中这个库有一些静态类(Logger、Config 等)。它接缝 web-app X 可以看到/使用 web-app Y 的静态实例。“随机”X 写入 Y 的日志文件。Y 使用来自 X 的配置......等等。

这通常是 Tomcat 中 JVM 的问题吗?

仅对于 Servlet,我可以将静态类存储在 ServletContext 中,但非 Servlet 无法访问它们,对吗?

这里是Config.java类中的构造函数

public class Config{
public static Config instance;

private Config(){

}
public static Config getInstance(){
if(instance==null) instance = new Config();
return instance;
}
}

在 Servlet 以及我使用的其他类中

private static Config config = Config.getInstance();

有没有其他方法可以在整个 Web 应用程序中共享一个类的一个实例,但只能在这个 Web 应用程序中共享?

最佳答案

在上下文 /X 中运行的任何东西都看不到 /Y/WEB-INF/libY/WEB-INF/classes 中的任何东西.原因是 /X/WEB-INF/lib 中的 jar 和 /X/WEB-INF/classes 中的类 在不同的类加载器中 比上下文 /Y 的 jar 和类强。这不是 Tomcat“问题”,这是根据 J2EE servlet 规范。

我会重新审视我的设计,但如果您真的需要在两个或多个上下文之间共享一个类,请将这些类放在一个 jar 中,并将该 jar 放在 ${CATALINA_HOME}/lib 中。该文件夹中的类对所有上下文都是可见的,因为它们是在作为上下文类加载器的父级的类加载器中加载的。

执行此操作的“正确”方法是在 JNDI 中注册对象,您应用的每个组件都可以在 JNDI 中查找它。

关于java - Servlet 中的单例和 Tomcat7 上的其他类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29952261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com