gpt4 book ai didi

java - Spring BeanFactory加载和卸载

转载 作者:行者123 更新时间:2023-12-02 00:21:52 25 4
gpt4 key购买 nike

  1. Spring 容器 (XMLBeanFactory) 何时被 Spring 优雅地卸载?
  2. 当应用程序正在运行但 BeanFactory 的唯一处理程序超出范围时会发生什么?
  3. 加载 Spring 容器的理想方式是什么? handler = new BeanFactory() 是正确的方法吗?


更新:
当容器超出范围时,我们确实希望调用 close() 方法,从而释放所有持有的资源。但这并没有发生!我遇到了一种情况,我的 spring 容器超出了范围,但内存仍然已满(OutOfMemory 错误)。原因是我的 Spring 容器创建的 SessionFactory 对象从未被垃圾回收,因为它们是静态创建的。这意味着当容器超出范围时,永远不会调用 close()->destroy() 。让我相信 Spring 本身存在泄漏问题。

最佳答案

  1. 这取决于您实例化它的方式。对于一个 Web 应用程序,这通常是在上下文关闭时完成的。在命令行上,您必须专门关闭上下文(通过“AbstractApplicationContext”上的“close”方法
  2. 与范围之外的任何其他内容相同。不确定“关闭”方法是否是终结器阶段的一部分。我希望终结器能够触发销毁阶段。
  3. 正如其他人所说,不要直接使用 BeanFactory。创建一个应用程序上下文。对于 Web 应用程序来说,最常见的方法是 ContextLoaderListener,对于命令行程序来说,最常见的方法是 ClassPathXmlApplicationContext。

// Keep a specific type, so we can call the "close" method later since it's // not part of the ApplicationContext interface itself. ClasspathXmlApplicationContext context = new ClasspathXmlApplicationContext(new String[] { "applicationContext.xml });

然后关闭它:

context.close();

对于网络应用程序:

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>

<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

关于java - Spring BeanFactory加载和卸载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10799727/

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