Spring BeanFactory加载和卸载

时间:2012-05-29 13:01:09

标签: java spring ioc-container

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

  4. 更新:
    当容器超出范围时,我们确实会期望调用close()方法,这将反过来释放所有持有的资源。但这不会发生!我遇到过一个案例,我的弹簧容器超出了范围,但内存仍然满了(OutOfMemory错误)。原因是我的Spring容器创建的SessionFactory对象从来没有被收集垃圾,因为它们是作为静态创建的。这意味着当容器超出范围时,永远不会调用close()->destroy()。让我相信Spring本身存在泄漏问题。

2 个答案:

答案 0 :(得分:3)

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

    //保留一个特定的类型,因此我们可以在以后调用“close”方法   它不是ApplicationContext接口本身的一部分。   ClasspathXmlApplicationContext context =        new classpathXmlApplicationContext(new String [] {“applicationContext.xml});

    然后你关闭它:

    context.close();
    

    对于webapps:

    <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>
    

答案 1 :(得分:0)

BeanFactory是在Spring中做事的古老方式。实例化Spring上下文的更现代的方法是通过ApplicationContext接口。供参考,请阅读

  

4.2.2 Instantiating a container

如果您打算在Web应用程序中使用Spring,请阅读

  

4.14.4 Convenient ApplicationContext instantiation for web applications