2012-05-29 60 views
0
  1. 何時Spring容器(XMLBeanFactory)被Spring正常卸載?
  2. 當應用程序正在運行但BeanFactory的唯一處理程序超出範圍時會發生什麼?
  3. 什麼是加載Spring容器的理想方式?正在做handler = new BeanFactory()正確的做法?


更新:
當容器超出範圍,我們的確會期望close()方法被調用這又將釋放所有佔用的資源。但那不會發生!我遇到了一個情況,那就是我的彈簧容器超出了範圍,但內存仍然充滿(OutOfMemory錯誤)。原因是Spring容器創建的SessionFactory對象從未被垃圾收集,因爲它們被創建爲靜態。這意味着當容器超出範圍時close()->destroy()從未被調用過。使我相信Spring本身存在泄漏問題。Spring BeanFactory的加載和卸載

回答

3
  1. 這取決於如何你正在實例化它。我是一個web應用程序,這通常是在上下文關閉時完成的。在命令行中,您必須特別關閉上下文(通過「AbstractApplicationContext」上的「close」方法)
  2. 與超出範圍的任何其他內容一樣不知道「close」方法是否是終結器階段的一部分或者不是,我希望終結器會觸發破壞階段
  3. 正如別人所說,不要直接使用BeanFactory創建一個ApplicationContext對於Web應用程序最常用的方式是ContextLoaderListener,對於命令行程序是的ClassPathXmlApplicationContext。

//保持一個特定的類型,所以以後我們可以稱之爲「親密」的方法,因爲 //它不是ApplicationContext接口本身的一部分。 ClassPathXmlApplicationContext的上下文= 新的ClassPathXmlApplicationContext(新的String [] {「的applicationContext.xml});

再後來就關閉它:

context.close(); 

對於web應用:

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

感謝Matt。 (1)和(3)非常有幫助。對於(2),我有一些真正的擔憂。請參閱更新。 – Leo

+0

如果close()不是終結器的一部分,那麼當Web應用程序上下文關閉或JVM關閉時,誰觸發此方法? – Leo

0

BeanFactory是在春天做事的古老方式。實例化Spring上下文的更現代的方式是通過ApplicationContext接口。僅供參考,請閱讀

4.2.2 Instantiating a container

如果你想在一個Web應用程序使用Spring,也看過

4.14.4 Convenient ApplicationContext instantiation for web applications

+0

BeanFactory並不比ApplicationContext更古老,它們幾乎同時創建。ApplicationContext是泛型BeanFactory的豐富版本,包含消息傳遞,事件,層次結構,生命週期等。 –