2012-05-29 7 views
0
  1. Когда весенний контейнер (XMLBeanFactory) изящно выгружен весной?
  2. Что происходит, когда приложение работает, но единственный обработчик BeanFactory выходит за рамки?
  3. Каков идеальный способ загрузки весеннего контейнера? Делает handler = new BeanFactory() правильным подходом?


Update:
Когда контейнер выходит из области видимости, мы действительно ожидаем, что метод Close(), чтобы назвать что, в свою очередь, освобождение всех занимаемыми ресурсов. Но этого не бывает! Я столкнулся с ситуацией, когда у меня были весенние контейнеры, выходящие из сферы действия, но все еще память заполнялась (ошибка OutOfMemory). Причина заключалась в том, что объекты SessionFactory, созданные моими контейнерами Spring, никогда не получали сбор мусора, поскольку они создаются как статические. Это означает, что close()->destroy() никогда не вызывался, когда контейнеры выходили за рамки. Заставляет меня поверить, что проблема с утечкой связана с самой весной.Spring BeanFactory погрузка и разгрузка

ответ

3
  1. Это зависит от того, как вы создаете его. Я webapp, это обычно делается при отключении контекста. В командной строке вам нужно специально закрыть контекст (методом «закрыть» в «AbstractApplicationContext»
  2. То же, что и все остальное, что выходит из области видимости. Не уверен, что метод «закрыть» является частью фазы финализатора или нет. Я надеюсь, что финализатор вызовет фазу уничтожения.
  3. Как сказал кто-то другой, не используйте BeanFactory напрямую. Создайте ApplicationContext. Наиболее распространенным способом для веб-приложений является ContextLoaderListener, а для программ командной строки быть ClassPathXmlApplicationContext.

// Сохраняет определенный тип, поэтому мы можем вызвать метод «закрыть» позже, так как Это // не является частью интерфейса ApplicationContext. ClasspathXmlApplicationContext контекст = новый ClasspathXmlApplicationContext (новый 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> 
+0

Thanks Matt. (1) и (3) были весьма полезными. Для (2) у меня есть некоторые настоящие проблемы. См. Обновление. – Leo

+0

И если close() не является частью финализатора, то кто запускает этот метод, когда контекст веб-приложения отключается или когда JVM отключается? – Leo

0

BeanFactory - древний способ сделать что-то весной. Более современный способ создания контекста Spring - это интерфейс ApplicationContext. Для справки, читайте

4.2.2 Instantiating a container

Если вы собираетесь использовать Spring в Web App, а также прочитать

4.14.4 Convenient ApplicationContext instantiation for web applications

+0

BeanFactory не является более древним, чем ApplicationContext. Они были созданы примерно в одно и то же время.ApplicationContext - это обогащенная версия родового BeanFactory и содержит сообщения, события, иерархии, жизненные циклы и т. Д. –