gpt4 book ai didi

java - 是否可以在公共(public)/共享上下文中使用 Spring 库?

转载 作者:行者123 更新时间:2023-12-01 00:37:44 25 4
gpt4 key购买 nike

我们有一个门户应用程序,其中包含一个主要网络应用程序上下文和许多次要网络应用程序上下文 - 插件。目前(非常简化)主要有自己的 spring 库,如果他们想使用 spring,插件也必须有它们。在公共(public)/共享的 tomcat 上下文中,只有驱动程序和接口(interface)。

如果将 spring 库移动到与 spring 可能间接使用或它们可能使用 spring 的其他库相关的公共(public)上下文中,它会起作用吗?像 hibernate 一样,因为应用程序正在使用 spring-tx 等。 hibernate 是否也必须转移到公共(public)/共享上下文?

你怎么看,还有哪些方面?从 spring 应用程序上下文的角度来看,这样会容易得多。

最佳答案

@RichW 正确地指出将 Spring 库放在 Tomcat 的通用类加载器中是不好的做法。而且很有可能它不会起作用。

Java 使用 classloader hierarchy ).当请求类加载时,类加载器将递归地从它的父类加载器请求类,然后​​再尝试使用它自己的类路径加载类。这个过程一直持续到根类加载器(称为引导类加载器)。通过这种方式,从父类加载器引用的类总是优先于类加载器中引用的类,层次结构更靠下。

重要的是要注意,在此过程中,类永远不会从子类加载器加载。因此,Spring 所需的任何类也需要加载到公共(public)类加载器中——包括 asm、log4j、commons-logging 和 cglib(所有这些都是 spring 所依赖的)。这将导致一大堆问题:特别是,在公共(public)类路径中包括 commons-logging 是 a whole world of hurt

如果您真的设法让 Tomcat 启动,那么在回收应用程序时您会遇到内存泄漏问题。在 tomcat 中,应用程序是使用传统的垃圾收集卸载的,因此如果有任何东西持有对随后重新启动的应用程序内部类的引用,则该应用程序将不会进行垃圾收集。 Spring 和日志记录框架是保存类引用的主要候选者,因此您可能会在几次应用程序重新启动后遇到 OOM 错误。

安全地执行此操作的唯一方法是考虑使用成熟的应用程序服务器(例如 JBoss AS)并将您的应用程序部署为 EAR。

关于java - 是否可以在公共(public)/共享上下文中使用 Spring 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7418310/

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