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



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

最佳答案

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



  //保持特定的类型,因此我们以后可以调用“ close”方法,因为
  它不属于ApplicationContext接口本身。
  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>

08-04 22:26